Foros del Web » Programando para Internet » Javascript »

Leer varios XML al mismo tiempo

Estas en el tema de Leer varios XML al mismo tiempo en el foro de Javascript en Foros del Web. Hola, Tengo que leer 3 xml diferentes para luego parsearlos al mismo tiempo y lograr una salida con datos mezclados. Estos son ejemplos de los ...
  #1 (permalink)  
Antiguo 23/09/2009, 11:46
 
Fecha de Ingreso: julio-2006
Ubicación: Montevideo
Mensajes: 34
Antigüedad: 17 años, 10 meses
Puntos: 0
Leer varios XML al mismo tiempo

Hola,

Tengo que leer 3 xml diferentes para luego parsearlos al mismo tiempo y lograr una salida con datos mezclados.

Estos son ejemplos de los XML.

nombres.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<info>
<persona>
<id>id1</id>
<nombre>Alejandro</nombre>
</persona>
<persona>
<id>id2</id>
<nombre>Lorena</nombre>
</persona>
</info>

recetas_hoy.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<hoy>
<receta>
<id>id1</id>
<plato>pez</plato>
<postre>helado</postre>
</receta>
<receta>
<id>id2</id>
<plato>cerdo</plato>
<postre>torta</postre>
</receta>
</hoy>

recetas_semana.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<semana>
<receta>
<id>id1</id>
<dia>
<plato>pato</plato>
<postre>tarta</postre>
</dia>
<dia>
<plato>vaca</plato>
<postre>cafe</postre>
</dia>
<dia>
...
...
</dia>
</receta>
<receta>
<id>id2</id>
<dia>
<plato>verdura</plato>
<postre>flan</postre>
</dia>
<dia>
<plato>pasta</plato>
<postre>dulce</postre>
</dia>
<dia>
...
...
</dia>
</receta>
</semana>

Ok, estos son los xml que tengo, mi primera duda es como puedo hacer para esperar a cargar los 3 xml para poder comenzar a procesarlos, dejo todo comentado en el codigo de la página.

Código página html

<html>
<head>
<title>Test xml</title>

<script language="javascript">
var xmlnombres;
var xmlrecetashoy;
var xmlrecetassemana;

function crearObjetoXML(){
nombres="nombres.xml"
recetas_hoy="recetas_hoy.xml"
recetas_semana="recetas_semana.xml"

// si es IE
if(window.ActiveXObject){

//leo nombre
xmlnombres = new ActiveXObject("Microsoft.XMLDOM");
xmlnombres.async = false;
xmlnombres.load(nombres.xml);
//leo recetas de hoy
xmlrecetashoy = new ActiveXObject("Microsoft.XMLDOM");
xmlrecetashoy.async = false;
xmlrecetashoy.load(recetas_hoy.xml);
//leo recetas de la semana
xmlrecetassemana = new ActiveXObject("Microsoft.XMLDOM");
xmlrecetassemana.async = false;
xmlrecetassemana.load(recetas_semana.xml);

////// Duda como verifico onload de los 3 xml antes de seguir
if (xmlrecetassemana.readyState == 4) {
parsearXML(xmlnombres,xmlrecetashoy,xmlrecetassema na);
}
else {
alert('Tu navegador no puede manejar este script');
return;
}

// si no es IE
}else if(document.implementation && document.implementation.createDocument){

//leo nombre
xmlnombres = document.implementation.createDocument("","",null) ;
xmlnombres.load(nombres);
//leo recetas de hoy
xmlrecetashoy = document.implementation.createDocument("","",null) ;
xmlrecetashoy.load(recetas_hoy);
//leo recetas de la semana
xmlrecetassemana = document.implementation.createDocument("","",null) ;
xmlrecetassemana.load(recetas_semana);

////// Duda como verifico onload de los 3 xml antes de seguir
xmlrecetassemana.onload = function()
{
parsearXML(xmlnombres,xmlrecetashoy,xmlrecetassema na);
}

}else{
alert ('Su navegador no puede soportar este script');
}
}



function parsearXML(xmlnombres,xmlrecetashoy,xmlrecetassema na)
{
var x = xmlnombres.getElementsByTagName('persona');
var y = xmlrecetashoy.getElementsByTagName('receta');
var z = xmlrecetassemana.getElementsByTagName('receta');
var test = ""

// recorro el xml nombres
for (i=0;i<x.length;i++) {

idx = x[i].getElementsByTagName("id")[0].firstChild.data;
nombre = x[i].getElementsByTagName("nombre")[0].firstChild.data;

// recorro recetas de hoy para ver si existe un nodo con el mismo id que el que tengo de antes
for (ii=0;ii<y.length;ii++) {
idy = y[ii].getElementsByTagName("id")[0].firstChild.data;
// si dentro de recetas hoy existe el id recorro y guardo
if (idx == idy) {
plato = y[ii].getElementsByTagName("plato")[0].firstChild.data;
postre = y[ii].getElementsByTagName("postre")[0].firstChild.data;
}
}

var test2 = ""
// recorro recetas semanal para ver si existe un nodo con el mismo id que el que tengo de antes
for (iii=0;iii<z.length;iii++) {
idz = z[iii].getElementsByTagName("id")[0].firstChild.data;
// si dentro de recetas semanal existe el id gargo nodo dia
if (idx == idz) {
var d = z[iii].getElementsByTagName("dia");
// recorro el xml recetas semanal dentro de los nodos dias que tienen el mismo id
for (iiii=0;iiii<d.length;iiii++) {
platod = d[iiii].getElementsByTagName("plato")[0].firstChild.data;
postred = d[iiii].getElementsByTagName("postre")[0].firstChild.data;
test2 += "dia "+iiii+" - " +platod+ " - " +postred+ "<br />";
}
}
}


test += idx+" - " +nombre+ " <br />Plato de hoy: " +plato+ " - " +postre+ "<br />" +test2+ "<br />";
}
document.getElementById('test').innerHTML = test;
}
</script>
</head>
<body onload="crearObjetoXML();">
<div id="test"></div>
</body>
</html>

Mi otra gran duda es como podría simplificar la funcion parsearXML(), creo que ahi cree algo que funciona, pero media complicada...

Última edición por Stendelis; 23/09/2009 a las 12:58
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:53.