XML DOM y JavaScript
Como todos sabemos tener datos en XML es algo muy útil y cada vez más habitual. El poder mostrar unos datos en un formato de texto plano y estándar nos sirve para poder compartir esos datos y poder leerlos desde casi cualquier aplicación y/o lenguaje de programación.
En este artículo vamos a usar JavaScript para mediante DOM leer el contenido de un XML simple.
Usaremos un XML muy simple y sencillo:
rammstein.xml
<?xml version="1.0" encoding="iso-8859-1"?> <miembros> <miembro idmiembro="0" nombre="Till Lindemann" fecha_nacimiento="04-01-1963" instrumento="vocales" /> <miembro idmiembro="1" nombre="Richard Z. Kruspe" fecha_nacimiento="24-06-1967" instrumento="guitarra" / > <miembro idmiembro="2" nombre="Paul Landers" fecha_nacimiento="09-12-1964" instrumento="guitarra" / > <miembro idmiembro="3" nombre="Christoph Schneider" fecha_nacimiento="11-05-1966" instrumento="bateria" / > <miembro idmiembro="4" nombre="Oliver Riedel" fecha_nacimiento="11-04-1971" instrumento="bajo" / > <miembro idmiembro="5" nombre="Flake Lorenz" fecha_nacimiento="06-11-1966" instrumento="teclados" / > </miembros>
Antes que nada deberemos de hacer la llamada y creación del objeto XML, deberemos de tener en cuenta para esto que la forma de crear el objeto es totalmente distinta para IE y para Mozilla/Firefox. Asi que empezaremos creando un archivo llamado ajax.js que es el que contendrá la llamada del objeto.
ajax.js
1.- Creamos la variable que va a contener el objeto xml, xmlDoc
var xmlDoc;
2.- Creamos la funcion ‘crearObjetoXML()’.
Esta función se encargará de crear el objeto XML correspondiente dependiendo del
navegador utilizado por el usuario (IE o Mozilla/Firefox). Le pasamos como parámetro el nombre del archivo XML
function crearObjetoXML(archivoXML){
//--- Compruebo si se trata de IE o no.
//--- Si es IE el objeto ActiveXObject existirá.
if(window.ActiveXObject){
//--- Creo un nuevo objeto de la librería Microsoft.XMLDOM que es la que se encarga
//--- en Internet Explorer de 'parsear' un archivo XML.
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
//--- Defino la asincronización a false
xmlDoc.async = false;
xmlDoc.load(archivoXML);
parsearXML();
}else if(document.implementation && document.implementation.createDocument){
xmlDoc = document.implementation.createDocument("","",null);
xmlDoc.load(archivoXML);
//--- Le decimos que cuando haya terminado de cargar el XML
//--- ejecute la función de parsear el mismo.
//--- NOTA: Se le llama a la función sin los paréntesis. Si se le colocan no funciona
xmlDoc.onload = parsearXML;
}else{
alert ('Su navegador no puede soportar este script');
}
}
Posteriormente creamos otro archivo javascript, functions.js que contendrá la función para parsear el XML.
Bien repasaremos las funciones de JavaScript que vamos a usar:
firstChild: Nos devuelve el primer nodo hijo del nodo superior
childNodes: Devuelve el nodo/s hijos del nodo superior.
getElementsByTagName(’miembro’)[i]: Hace referencia al tag indicado en su posición i.
getAttribute(’idmiembro’): Devuelve el valor del atributo indicado entre paréntesis siempre refiriéndose al nodo en el que se encuentra.
Pues una vez que sabemos que vamos a usar para parsearlo, solo nos queda armar la función.
1.- Creamos dos variables que harán referencia al id ‘contenido’ del HTML y otra a la longitud del documento XML
var contenido = document.getElementById('contenido');
var longitudXML = xmlDoc.firstChild.childNodes.length;
2.- Recorreremos el XML partiendo de las funciones vistas más arriba y de la longitud del XML
for(var i=0;i< =longitudXML-1;i++){
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('idmiembro')+' - ';
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('nombre')+' - ';
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('fecha_nacimiento')+' - ';
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('instrumento')+'
‘;
}
Asi el código del archivo final sería:
functions.js
function parsearXML(){
var contenido = document.getElementById("contenido");
var longitudXML = xmlDoc.firstChild.childNodes.length;
for(var i=0;i< =longitudXML-1;i++){
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('idmiembro')+' - ';
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('nombre')+' - ';
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('fecha_nacimiento')+' - ';
contenido.innerHTML += xmlDoc.firstChild.getElementsByTagName('miembro')[i].getAttribute('instrumento')+'
‘;
}
}
Por último y para acabar, pero no menos importante es el código
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" language="javascript" src="ajax.js"></script>
<script type="text/javascript" language="javascript" src="functions.js"></script>
<title>:: AJAX :: Ejemplo. XMLParser</title<
</head>
<body onload="crearObjetoXML('rammstein.xml');">
<div id="contenido">
</div>
</body>
</html>
Si lo deseis podeis ver un ejemplo online funcionando aquí.
www.martinpulido.com/lab/ajax/xmlParser/
Me interesa mucho esta implementación pero cuando despliego el resultado (o sea la página), me sale una página en blanco. También el ejemplo online está así. No entiendo… te solicito ayuda.
A mi tampoco me funciona
Sou, Menda.
Os quiero pedir disculpas antes que nada. He comprobado -por desgracia- que para Internet Explorer no funciona. Y es raro, y lo digo porque casi siempre suelo comprobar con IE, Firefox y Opera que todos los scripts que hago funcionan, con lo que no entiendo que ha podido pasar.
De cualquier manera voy a revisar el script y ver que puede fallar. Deduzco que no es un error de JavaScript, con lo el problema puede estar a la hora de parsear el XML porque el ActiveX no lo haga de forma correcta.
Os mantendré informados.
Gracias
Hola,
me gusta mucho el contenido y la presentación de tu página. Realmente, estaba buscando cómo hacer en php con javascript un formulario que contiene varios selects dependientes como por ejemplo para el registro de países, estados y ciudades. Y me gustaría saber si tienes un ejemplo por ahi que me permitas, he estado leyendo y parece que se puede hacer con algo que para mi es nuevo AJAX. Me podrías dar una indicación acerca de cómo resolver éste problema? gracias
Hola Raúl.
Me alegro mucho que te guste el blog.
Con respecto a tu consulta no tengo un ejemplo hecho, pero me has dado una idea para el proximo ‘ejercicio’ con AJAX.
Permanece atento al blog, quizá en unos días tengas por aquí un post dedicado a eso.
Salu2
Santi M.
Hola, yo tengo un problema parecido al fallo que hay en este codigo para iE.
Estoy parseando los datos de un xml y recorriendo sus nodos.
Todo bien hasta que a la hora de mostrar la informacion en el HTML no me lo hace. El error esta en el innerHTML que desde la funcion no se ejecuta, en cambio si lo llamo desde un enlace si.
Mi codigo:
(index.html) ——————-
XML
“+data); “;
}
//Aqui ya hemos recorrido una localizacion entera, enviamos valores al html
switch (i) {
case 0: nombre=”comu”; break;
case 1: nombre=”prov”; break;
case 2: nombre=”coma”; break;
case 3: nombre=”muni”; break;
}
writeData(salida[i],nombre);
}
}
if (window.ActiveXObject) getData(); else xmlDoc.onload=getData;
//–>
comu
prov
coma
muni
prueba
————————-
(location.xml) —————
comun11
comun22
comun33
comun44
comun55
comun66
prov11
prov22
prov33
prov44
coma11
coma22
coma33
muni11
muni22
——————————-
Salu2
Hola a todos, investigando un poco encontre porque no funcionaba el codigo en IE, sigue la correcion del codigo:
function parsearXML(){
var contenido = document.getElementById(”contenido”);
var longitudXML = xmlDoc.documentElement.firstChild.childNodes.length;
for(var i=0;i
Hola estoy desarrollando un sito web de bolsa y necesitaría mostar las cotizaciones de los diferentes valores del mercado continuo español. Mi problema es que no se como mostar esto en mí pagina ya que no se de donde sacar la información de las cotizaciones. ¿Podría obtener está información de otra página ?
¿Como puedo hacer esto?
¿Tendrías un ejemplo ?
Un saludo..
Este codigo no sirve para firefox! please help me!
Hola, quisiera que me ayuden a mostrar los datos de un dataset en una web con tecnología asp mediante una función en javascript.
Gracias.
Hola, mira mi problema es el siguiente:
Realizo todo lo que tu dices, crear dos archivos .js, uno donde creo el objeto XML() y el otro donde esta la funcion para parcear el archivo. Luego creo un archivo .html y no me funciona, no me muestra nada.
archivo ajax.js
function crearObjetoXML(archivoXML){
var xmlDoc;
if(window.ActiveXObject){
xmlDoc = new ActiveXObject(”MSXML2.DOMDocument.3.0″);
//—xmlDoc.async = false;
xmlDoc.load(archivoXML);
parsearXML();
}
else
if(document.implementation && document.implementation.createDocument){
xmlDoc = document.implementation.createDocument(”",”",null);
xmlDoc.load(archivoXML);
xmlDoc.onload = parsearXML;
}
else
{
alert (’Su navegador no puede soportar este script’);
}
}
archivo function.js
function parsearXML(){
var contenido = document.getElementById(”contenido”);
var longitudXML = xmlDoc.firstChild.childNodes.length;
for(var i=0;i
:: AJAX :: Ejemplo. XMLParser
necesito validar que el contenido sea distinto de vacio
como lo hago???
ya saben porque no levanta los datos?
porque este script no funciona devuelve una pagina en blanco.
y con la aclaracion de maximo perez tampoco funciona
gracias
Si lo hacéis a través de Mozilla se ve perfectamente el ejemplo
Hola Santi,
estoy intentando usar tu script para parsear un xml. Me funciona correctamente con un xml que se encuentra en el mismo dominio, pero cuando intento leer un xml externo no funciona. Alguna cosa que deberíamos añadir a la funcion para que xmlDoc.load (archivoXML) funcione?
Muchas gracias de antemano.
P.D. Los comentarios de tu blog no se ven ni funcionan en Firefox
Hola Esther!
Justo lo que comentas me pasó cuando quería leer el contenido de un RSS. Lo que hice fue crear un archivo PHP al que le pasaba como parámetro la URL y le decía que la salida de este archivo fuera del tipo xml y con readfile() pintaba el contenido del archivo.
< ? $url = $_REQUEST['url']; header("Content-type: text/xml"); readfile ($url); ?>Si quieres échale un vistazo al artículo en el que lo utilizo, te pongo el enlace a continuación:
http://www.martinpulido.com/blog/2006/02/13/ajax-rss-reader/
Con respecto a los comentarios, la última semana tuve un problema con mi proveedor de hosting y me corrompieron la tabla de los comentarios por lo que no aparecían. Afortunadamente me la repararon y no conseguí perder ningun comentario.
Te pido por favor, que borres la caché, porque supongo que es probable que esté tirando de ahí.
PD: Muy bueno tu blog, ya tengo otro para visitar cada día.
Salu2
Santi M.
La verdad que muy buena la informacion que encontre en tu blog, mi problema es como cargar un xmlDocument desde texto, no necesariamente desde un archivo. Si puedes ayudarme te lo agradeceré.
Saludos desde Argentina
Gracias por la explicación. Yo mantengo una web personal sobre mi hobby asi que soy un simple aficionado que no tiene ninguna idea de programación aunque aprendi bastante por “prueba y error”. Realmente tu blog es facil de comprender para los que “tocamos de oido”.
Respecto al código que no funciona, estuve haciendo pruebas y el error que me da es eso de “firstChild”. Yo use firstChild.data para ver a que apuntaba y me dio “” no a miembros. Lo mismo “xmlDoc.firstChild.childNodes.length;” que daba 0.
Reemplace el functions.js por lo siguiente y me funciono muy bien tanto en IE como FireFox:
function parsearXML(){
var contenido = document.getElementById(”contenido”);
var item = xmlDoc.getElementsByTagName(’miembros’)[0];
var longitudXML = item.childNodes.length;
for(var i=0;i ‘;
};
}
Espero les haya sido util, pregunto ¿hay muchos Navegadores o versiones que no soporte este código? me resulto muy interesante para usarlo en mi web pero no quiero dejar fuera visitantes.
el xml deben arreglarlo, si lo copian justo como esta ahi en la pagina el tag de cierre de cada linea esta separado del cierre de este(esta asi / > en vez de asi />), de esta forma el xml no se crea correctamente. Y en la funcion parsearXML() en la ultima linea dentro del ciclo arreglen la ultima comilla que aparece, no es la correcta, por lo demas esta todo OK, y me funciono tanto en IE como en FireFox.
Gracias por el tutorial, la verdad es que esta muy bueno!!
saludos