Foros del Web » Creando para Internet » Flash y Actionscript »

Leer XML recursivamente. Me falla.

Estas en el tema de Leer XML recursivamente. Me falla. en el foro de Flash y Actionscript en Foros del Web. Buenas noches a todos !!! Verán, estoy intentando hacer una función que me lea un XML recursivamente, sin que dependa de cuantos nodos hijos tenga ...
  #1 (permalink)  
Antiguo 06/12/2004, 16:33
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 5 meses
Puntos: 7
Leer XML recursivamente. Me falla.

Buenas noches a todos !!!

Verán, estoy intentando hacer una función que me lea un XML recursivamente, sin que dependa de cuantos nodos hijos tenga ni nada por el estilo.

Para ello he creado lo siguiente:

Partiendo de un fichero XML llamado: Configuracion.xml con la siguiente estructura:

<?xml version="1.0" encoding="iso-8859-1"?>
<Menu>
<Mnusistemas texto="Sistemas Operativos">
<Sistema texto="Linux">
<Subsistema>Slackware</Subsistema>
<Subsistema>Debian</Subsistema>
<Subsistema>Red Hat</Subsistema>
</Sistema>
<Sistema texto="Windows">
<Subsistema>Windows 2000</Subsistema>
<Subsistema>Longhorn</Subsistema>
<Subsistema>Windows XP</Subsistema>
</Sistema>
</Mnusistemas>
<Mnulenguajes texto="Lenguajes de Programacion">
<Lenguaje>Visual Basic</Lenguaje>
<Lenguaje>Action Script</Lenguaje>
<Lenguaje>Cobol</Lenguaje>
<Lenguaje>C#</Lenguaje>
</Mnulenguajes>
</Menu>

He creado la siguiente función, pero no me funciona del todo y la verdad, por más que me como la cabeza no sé como podría hacerlo, espero que puedan hecharme un cable:

function crearMenu(nodo){
for(var i=0; i<nodo.childNodes.length; i++){

if (nodo.childNodes[i].hasChildNodes()){
trace(nodo.childNodes[i].attributes.texto);
crearMenu(nodo.childNodes[i]);
}else{
trace(nodo.childNodes[i].nodeValue);
}

}
}
crearMenu(Objxml.firstChild);

Asi en teoría deberia de cargarme el menu completo ¿Verdad?, ¿Alguien puede corregir mi error o indicarme que es lo que me falta y me sobra?, os estaré muy agradecido y desde ya, muchas gracias.

Saludos !!!
__________________
Charlie.

Última edición por chcma; 06/12/2004 a las 16:48
  #2 (permalink)  
Antiguo 06/12/2004, 17:49
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 5 meses
Puntos: 7
Bueno, ya se cual es el fallo (Pero no se solucionarlo).

Me muestra todos los elementos perfectamente, cuando es un nodo de tipo Texto, me muestra su nodeValue pero con un fallo.

<Subsistema>Slackware</Subsistema>

Aqui tengo el problema, resulta que me interpreta como un nodo <Subsistema> y otro nodo Slackware.

Entonces, claro, me intenta mostrar el attribute de Subsistema y como no tiene me pone undefined.

if (nodo.childNodes[i].hasChildNodes()){
trace(nodo.childNodes[i].attributes.texto);
crearMenu(nodo.childNodes[i]);
}else{
trace(nodo.childNodes[i].nodeValue);
}

En el bucle del for, lo que primero me hace es mostrar el attribute de <Subsistema> y despues me muestra el nodeValue Slackware (Por ejemplo).

¿No deberia pillarme todo el nodo <Subsistema>Slackware</Subsistema> como un nodo de tipo texto y asi no intentar mostrar los atributos (QUE NO TIENE) el nodo?
__________________
Charlie.
  #3 (permalink)  
Antiguo 06/12/2004, 17:57
Avatar de TMeister
Crazy Coder
 
Fecha de Ingreso: enero-2002
Ubicación: En la Oficina
Mensajes: 2.880
Antigüedad: 22 años, 10 meses
Puntos: 193
Prueba algo asi..

Código:
function crearMenu(nodo) {
	for (var i = 0; i<nodo.childNodes.length; i++) {
		if (nodo.childNodes[i].hasChildNodes()) {
			if (nodo.childNodes[i].attributes.texto != undefined) {
				trace(nodo.childNodes[i].attributes.texto);
				crearMenu(nodo.childNodes[i]);
			} else {
				trace("   => "+nodo.childNodes[i].firstChild);
			}
		}
	}
}
var a = new XML();
a.ignoreWhite = true;
a.load("kill.xml");
a.onLoad = function() {
	crearMenu(a.firstChild);
};
Con el Mismo XML que publicaste...
  #4 (permalink)  
Antiguo 06/12/2004, 18:19
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 5 meses
Puntos: 7
Gracias ya está, sin embargo, ¿Crees que eso es lo más optimo y acaso <Subsistemas>Slackware</Subsistemas> No es un nodo de tipo texto?
__________________
Charlie.
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 23:02.