04 August 2008

selectSingleNode Mozilla e IE

Las funciones selectNodes y selectSingleNode son muy útiles para seleccionar nodos, en objetos XML utilizando sentencias XPath; ambas se pueden encontrar dentro de IE, pero NO dentro de FireFox (Mozilla) la cual ofrece otra función llamada evaluate.

Por ejemplo, si tenemos una página que utiliza AJAX, que recoge la respuesta de un servidor y la trata como un documento xml, y además deseamos acceder directamente a sus nodos utilizando XPath, para rellenar o validar algunos campos; tenemos el problema de la "compatibilidad de navegadores".

var req = new XMLHttpRequest();
req.open("GET", "http://miserver/content/coordenadas.xml", false);
req.send(datos);
var xml = req.responseXML;

El contenido de la variable xml sería la siguiente estructura:
<?xml version="1.0" encoding="utf-8">
<coordenadas>
<x>12.3456</x>
<y>-4.789</y>
</coordenadas>

Para acceder al valor de x desde IE sería algo así (funciona):
var x = xml.selectSingleNode("//X").text;

Para acceder al valor de x desde Mozilla sería así (NO FUNCIONA):
var nsResolver = xml.createNSResolver
( xml.ownerDocument == null ?
xml.documentElement :
xml.ownerDocument.documentElement);

var xIterator = xml.evaluate("//X", xml, nsResolver,
XPathResult.ANY_TYPE, null );


La solución
  • incorporar dentro de mi página la libreria mozXPath.js
  • distinguir si estoy utilizando IE o MoRzilla


if (window.ActiveXObject){
x = xml.selectSingleNode("//X").text;
} else if (document.implementation && document.implementation.createDocument){
x = xml.getElementsByTagName("X")[0]

.selectSingleNode("text()").nodeValue;

}

No pienso decir gran cosa de la funcion evaluate, que cada cual la pruebe y la critique; a mí personalmente su documentación me ha hecho perder el tiempo.


Libreria útil para utilizar selectNodes y selectSingleNode en Mozilla:
http://km0.la/js/mozXPath/


Enlaces Mozilla:
http://developer.mozilla.org/en/docs/DOM:document.evaluate
http://developer.mozilla.org/en/docs/XPathResult
http://developer.mozilla.org/en/docs/Introduction_to_using_XPath_in_JavaScript
http://www.anieto2k.com/2006/12/10/usando-xpath-desde-javascript/

- FIN -

1 comment:

Un tal Ivan del código said...

Umm yo conocía un navegador llamado Firefox de la empresa Mozilla... pero no uno llamado MoRzilla.

Atentamente,