jQuery XML no funciona bien en IE7 ni IE8

El framework  jQuery nos ha facilitado a los desarrolladores el acceso a los datos XML que provienen de AJAX; pero también permite leer XML contenido en la propia página con javascript. Eso sí, funciona mucho mejor en Chrome y Firefox que en Internet explorer.

Si en un input tenemos el siguiente texto:

<granja>
<animal id="0001">vaca</animal>
<animal id="0002">oveja</animal>
<animal id="0003">gallina</animal>
</granja>

Con jQuery podemos recorrerlo directamente con este código:

$(inputXML.value).find('animal').each(
function(){
$(this).text (); //devuelve el texto
$(this).attr ('id'); // devuelve un atributo
});

Como veréis, es mucho más intuitivo y rápido que utilizar directamente  los métodos de la clase XMLHttpRequest.

Eso sí, en Chrome y Firefox porque la función find no nos funcionará en IE7 e IE8 (esto es lo mismo que decir en todos los Windows XP que hay todavía activos, y que son muchos).

Esto es debido a que IE detectará que estamos en un documento HTML y no XML y lo podemos solventar así:

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(inputXML.value);
$("granja", xmlDoc).find("animal").each( function() {
$(this).text (); //devuelve el texto
$(this).attr ('id'); // devuelve un atributo
});

En mi caso, se trata de un aplicativo que siempre se accederá con IE7 (se ejecuta en un entorno controlado) pero si deseamos publicar algo así, deberíamos utilizar el objeto XMLDOM correcto para cada navegador – lo sé, qué rollo.

if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(inputXML.value,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.loadXML(inputXML.value);
}

Ultima hora:

Si las claves de XML vienen del serializado de un objeto, IE8 nos va a exigir que las marcas XML no contengan información sobre paquete: <es.josedetorre.MiClase>dato</es.josedetorre.MiClase> es inválido.

El error que da es «sólo se admite un elemento de nivel superior en un documento XML» aunque el fichero esté bien formado.

La solución es serializar sin información de paquete: <MiClase>datos</MiClase>