[eside-ghost] OT: xpath con javascript

Jon Ander Hernandez eside-ghost@deusto.es
04 Sep 2003 23:38:08 +0200


Aupa!

> XPath usado desde Javascript

La verdad es que es una muy buena pregunta, y tiene una respuesta
compleja. Esta pregunta me la hice yo hace un tiempo y ahora con la
escusa de tu pregunta me he puesto a investigar un poquillo ... jejeje.
Pero es una respuesta complicada y mas como para darla en un curso.

XPath como especificación solo cubre y solo es el mecanismo de selección
de nodos de un arbol xml por medio de un patrón (similar a una regular
expresion); y esta pensado para ser usado por medio de otros estandares
(Por ejemplo dentro de un template de XSLT, ejemplo tipico, aunque tb
puede usarse en XPointer, en XLink y seguro que en alguno más).

Ante lo de javascript recordar la confusion entre javascript y dom.
Nosotros cuando programamos algo usando javascript, en realidad el
standard que importa no es javascript, sino DOM que son las interfaces
que javascript usa para acceder/manipular el arbol de nodos, por lo que
la pregunta es .. podemos usar xpath dentro de DOM? la respuesta es ...
de momento no, el DOM Level 2 (el standard actual) no lo permite. 
Existe como borrador un modulo que hace esto para la futura version de
DOM http://www.w3.org/TR/2003/CR-DOM-Level-3-XPath-20030331/xpath.html;
pero es un borrador por no esta ni siquera esta implementado en el msxml
(el parser de microsoft). Curiosamente mozilla ya posee las interfaces,
otra cosa es que funcionen (y estan puestas para ya ir empezando a
probar el sistema, pero cambiará asi que no lo useis ... jejejeje).


Y bueno la verdad es que m$ como siempre ... ha hecho una extensión al
DOM 2 que si que permite hacerlo, el metodo se llama selectNodes y
funciona exactamente igual que getElementsByTagName solo que en vez de
pasarle un tag como argumento le pasas una expresion xpath.

ejemplo :
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
var objNodeList;
xmlDoc.async = false;
xmlDoc.resolveExternals = false;
xmlDoc.load("fichero.xml");
if (xmlDoc.parseError.errorCode <> 0) {
   var myErr = xmlDoc.parseError;
   alert("You have error " + myErr.reason);
} else {
   objNodeList = xmlDoc.documentElement.selectNodes("//*");
   alert(objNodeList.length);
}

Interfaces de mozilla y concretamente en la que hace referencia a XPath:
http://cgi.din.or.jp/~hagi3/JavaScript/JSTips/Mozilla/idl.cgi?idl=Mtrunk&smp=y&c4=1&c7=1&c17=1&src=cat&srcstr=#nsIDOMXPathEvaluator

> HttpRequest con Javascript tb

El HTTPRequest es otra extension de microsoft que al final incluso ha
sido adoptada por el mozilla, lo unico que el objeto no se instancia de
la misma manera que cuando usas ie, porque en el ie hay que instanciar
el msxml que es un activex; pero por lo demas funciona igual.

Doc sobre el HTTPRequest en la webpage de mozilla :
http://unstable.elemental.com/mozilla/build/latest/mozilla/extensions/dox/interfacensIXMLHttpRequest.html

Un ejemplo muy bueno para tanto mozilla como ie :
http://webfx.eae.net/dhtml/xmlextras/demo.html

espero que te halla servido para algo ;-) y suerte con el curso!!

JonAn.

P.D: lo de xpath .. tal vez se pueda hacer tb con xpointer, pero es un
tema inexplorado por mi en este momento asique no puedo hablar :-(.