En AJAX hay dos formas de devolver un respuesta del servidor, XML o HTML, para ello accedemos con los métodos
responseXML o responseTEXT, hasta el momento la forma mas fácil de acceder al contenido es mediante la segunda opción, aunque la primera es mucho mas potente ya que puedes indexar o ejecutar comandos según la estructura del XML devuelta.
Para acceder y leer el XML es un poquito lioso. Imaginemos este XML (sin saltos de linea):
<ajax>
<info type="200">Ok</info>
<block id="content"><![CDATA[ Content HTML ]]></block>
<block id="content2"><![CDATA[ Content HTML 2 ]]></block>
</ajax>
Para leer este XML con js lo hacemos de la siguiente forma:
var xml = obj.responseXML.documentElement;
for (i=0; i<xml.childNodes.length; i++) {
//nombre del tag
alert(xml.childNodes[i].nodeName);
//valor del tag
alert(xml.childNodes[i].firstChild.nodeValue);
}
No es muy lioso que digamos pero la cosa se complica cuando se anidan mas etiquetas o cuando incluimos atributos.
Con easyXML he intentado simplificar el proceso para que el acceso sea menos complejo.
easyXML depende de 3 funciones y dos variables.
- .tag función busqueda de nodos segun su nombre
- .item función para iterar sobre los nodos
- .name nombre del nodo
- .value valor del nodo // puede ser un objeto si es un contenedor
- .attr función para acceder a los atributos
El mismo ejemplo con easyXML:
var xml = new easyXML(obj.responseXML);
while(child = xml.item()) {
alert(child.name);
alert(child.value);
}
Por medio del bucle while conseguimos desplazarnos por todo los ítems secundarios. También con la función item() puedes acceder a un nodo en concreto, xml.item(1).value devuelve “Content HTML”.
Para acceder a los atributos es tan sencillo como usar la función attr o acceder directamente, xml.item().attr.type o xml.item().attr("type") devuelve el atributo type del primer elemento.
El XML lo puedes complicar tantas veces como quieras, para acceder a los nodos solamente tienes que usar el bucle y la función item dentro del objeto.
var xml = new easyXML(obj.responseXML);
while(child = xml.item()) {
//en caso de que child también anide, child.value será un objeto
//child.value.item() es igual a child.item()
while(next = child.item()) {
alert(next.value);
}
}
También puedes buscar los childNodes dependiendo del nombre del tag.
var xml = new easyXML(obj.responseXML);
var block = xml.tag("block");
while(item = block.item()) {
alert(item.value);
}
Puedes descargar easyXML y probar su funcionamiento con tus aplicaciones AJAX.