Foros del Web » Programando para Internet » Javascript » Frameworks JS »

recorrer un XML

Estas en el tema de recorrer un XML en el foro de Frameworks JS en Foros del Web. Hola a todos, estoy intentando recoger los datos de un XML pero me encuentro con un problema. En XML sería algo así: Código: <periodico> <noticia> ...
  #1 (permalink)  
Antiguo 06/07/2005, 01:39
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
recorrer un XML

Hola a todos, estoy intentando recoger los datos de un XML pero me encuentro con un problema. En XML sería algo así:
Código:
<periodico>
<noticia>
<titular>Esto es un titular</titular>
<cuerpo>Blah, Blah, Blah, Blah, Blah, Blah, </cuerpo>
<enlaces>
<web url="www.direccion.com" palabra="Pincha aqui">
<web url="www.otradireccion.com" palabra="Haz Click aqui">
<web url="www.unmasdireccion.com" palabra="Pincha Alli">
</enlaces>
</noticia>
<noticia>
...
</noticia>
</periodico>
Soy capaza de acceder a cada una de las noticias, pero lo q no soy capaz es de acceder a cada uno de los enlaces de cada noticia.
Estoy usando AJAX para acceder al XML y el codigo q uso es un bucle q recorre el xml hasta q no hay mas nodos, luego para obtener el titular, etc:
Código:
t = xml.getElementsByTagName("titular")[i];
t = t.firstChild.data;
El problema es q no comprendo bien las funciones tipo getElementsByTagName, y demás sobre nodos, y no doy enocontrado nada sobre el tema.
Un saludo!!!
  #2 (permalink)  
Antiguo 06/07/2005, 12:16
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola juanpa615:

getElementsByTagName es el array de los elementos de asociados a un tag de un documento, entonces creo que te interesa controlar el array de noticias...
var lasNoticias = document.getElementsByTagName("noticias");

según veo, el elemento raiz y que representa al documento (document) es el tag periódico.

Por cada noticia, te interesa el array de tags web, entonces puedes usar un bucle que recorra el array de noticias, y luego recorrer el array de enlases (tag web)

for (var i = 0; i < lasNoticias.length; i++)
for (var j = 0, enlaces = lasNoticias[i]; j < lasNoticias.length; j++)
// y aquí deberías procesar los elementos enlaces[j]

Lo puse a ojo, pero espero que te sirva.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 07/07/2005, 00:12
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Gracias

Gracias Caricatos, sabia q ibas a responder tu, jejeje. Al final lo arreglé de la siguiente manera:
Código:
xml= ajax.responseXML;
xml_=xml.documentElement;
		long=xml_.childNodes.length;
	for(n=0;n<long;n++){
		titular= xml_.childNodes(n).getAttribute("titulo");
		subtitulo= xml_.childNodes(n).getAttribute("subtitulo");
		fecha= xml_.childNodes(n).getAttribute("fecha");
		cuerpo= xml_.childNodes(n).childNodes(0).firstChild.text;
            }
Lo que no sabía es la existenci ani el uso de ChildNodesm ni de getAttribute, con eso ya llego a cualquier parte del XML.
Un saludo.
  #4 (permalink)  
Antiguo 07/07/2005, 01:05
Avatar de KarlanKas
Moderador extraterrestre
 
Fecha de Ingreso: diciembre-2001
Ubicación: Madrid
Mensajes: 6.987
Antigüedad: 23 años
Puntos: 61
Vámonos a AJAX (pino)! (perdón por el chiste fácil).
__________________
Cómo escribir

No hay pregunta tonta, sino tonto que quiere seguir en la ignorancia.
  #5 (permalink)  
Antiguo 07/07/2005, 01:11
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Yo a ellos estoy, estoy con mi primera aplicacion php, ajax.
  #6 (permalink)  
Antiguo 07/07/2005, 18:27
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Cita:
Iniciado por juanpa615
Gracias Caricatos, sabia q ibas a responder tu, jejeje...
Bueno, sobre estas cosas me intereso... pero el DOM en documentos XML llevo muy poco tiempo viéndolo, y es de agradecer que aportes tus soluciones.

Creo que pronto tendremos unas FAQs de ajax, y estos datos que estás compartiendo seguramente serán muy útiles.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 12/07/2005, 03:03
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Mi gozo en un pozo. Resulta q todo iba bien en explorer y cuando voy a hacer la comprobacion e rigor en Mozilla y Netscape me da un error. Para recorrer el XML resultante de ajax (xml= ajax.responseXML;) guardo el xml en la variable xml_=xml.documentElement; y así recorría luego los nodos u sus atributos: xml_.getAttribute("encabezado"), xml_.childNodes(n).childNodes(0).firstChild.text, ...
Despues de un rato buscando que pasaba, encontre la Consola Javascript en Mozilla, donde me pone que xml_.childNodes is not a function. Ahora a ver si es problema de xml_=xml.documentElement o de la funcion en si childNodes no es válida para los navegadores Geckho.
  #8 (permalink)  
Antiguo 12/07/2005, 07:22
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Hola:

chilnodes no es una función sino un array... prueba cambiando los paréntesis por los corchetes... y sin duda los reconoce tanto mozilla como opera.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #9 (permalink)  
Antiguo 12/07/2005, 10:41
Avatar de linyera_net  
Fecha de Ingreso: julio-2005
Mensajes: 6
Antigüedad: 19 años, 5 meses
Puntos: 0
Hola Juanpa:

El problema lo tenes aqui:variable xml_=xml.documentElement;
ya que no todos los navegadores soportan este atributo (documentElement), el cual es el que encuentra el nodo raíz.
Nose, talvez ayude esta alternativa:
segun como veo q esta estructurado tu xml :
<periodico>
<noticia>
<titular>Esto es un titular</titular>
<cuerpo>Blah, Blah, Blah, Blah, Blah, Blah, </cuerpo>
<enlaces>
<web url="www.direccion.com" palabra="Pincha aqui">
<web url="www.otradireccion.com" palabra="Haz Click aqui">
<web url="www.unmasdireccion.com" palabra="Pincha Alli">
</enlaces>
</noticia>
<noticia>
...
</noticia>
</periodico>

Puedes saber cuantos nodos noticia tienes asi:
var total = http.responseXML.getElementsByTagName('noticia').l ength;

Luego podrias recorrer tu xml de esta forma:
for(i=0;i<total;i++){
titular = http.responseXML.getElementsByTagName('titulo')[i].firstChild.data;
subtitulo = http.responseXML.getElementsByTagName(subtitulo')[i].firstChild.data;
fecha = http.responseXML.getElementsByTagName('fecha')[i].firstChild.data;
cuerpo = http.responseXML.getElementsByTagName('cuerpo')[i].firstChild.data;
}

Espero te haya entendido y te pueda servir mi respuesta
  #10 (permalink)  
Antiguo 13/07/2005, 00:00
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Hola linyera_net, la solucion que me aportas es la que inicialmente habia implementado. El problema me llegó cuando tengo q recorrer el contenido del tag <enlaces> en
Código:
<periodico>
<noticia>
<titular>Esto es un titular</titular>
<cuerpo>Blah, Blah, Blah, Blah, Blah, Blah, </cuerpo>
<enlaces>
<web url="www.direccion.com" palabra="Pincha aqui">
<web url="www.otradireccion.com" palabra="Haz Click aqui">
<web url="www.unmasdireccion.com" palabra="Pincha Alli">
</enlaces>
</noticia>
<noticia>
...
</noticia>
</periodico>
para obtener cada uno de los enlaces.
Un saludo.
  #11 (permalink)  
Antiguo 13/07/2005, 02:04
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 19 años, 5 meses
Puntos: 0
para recorrer la etiqueta <enlaces> deberías acceder a ella y después a sus nodos hijo:

xml_.getElementsByTagName('cuerpo')[i].childNodes[x].getAttribute("url")

¡¡OJO!! en los navegadores basados en gecko cada salto de linea se interpreta como nodo de texto vacío, de ahí el error de "childNodes is not a function".

ejemplo:
<etiqueta></etiqueta>
#nodoTexto
<etiqueta></etiqueta>

Solución:

Encontrar todos los nodos vacios (nodeType==3) y eliminarlos

for(x=0;x<xml_.childNodes.length;x++){if(xml_.chil dNodes[x].nodeType==3){xml_.removeChild(xml_.childNodes[x]);}}
}

espero que te ayude
  #12 (permalink)  
Antiguo 13/07/2005, 02:05
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 19 años, 5 meses
Puntos: 0
xml_.getElementsByTagName('enlaces')[i].childNodes[x].getAttribute("url")

perdón.
  #13 (permalink)  
Antiguo 13/07/2005, 02:08
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Eso lo comprendo, pero de esa manera como distingo los enlaces de cada noticia? Porque me devolveria todos los tags <enlaces> de todas las <noticias>. El problema es que devuelva solo los enlaces de cada noticia.
  #14 (permalink)  
Antiguo 13/07/2005, 02:14
 
Fecha de Ingreso: julio-2005
Mensajes: 7
Antigüedad: 19 años, 5 meses
Puntos: 0
no te entiendo bien.
  #15 (permalink)  
Antiguo 13/07/2005, 06:06
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Voy a poner aqui los avances que fui haciendo:
Por ahora la forma que aceptan los 2 navegadores q estoy probando (explorer y mozilla) es xml_.getElementsByTagName('cuerpo')[0].firstChild.data.
La opcion del principio xml_.childNodes(n).childNodes(0).firstChild.text; solo me funcionó en explorer.
Partiendo de xml= ajax.responseXML; me fue válido en ambos xml_=xml.documentElement; Ya consigo recorrer los tas de ¿primer nivel?
Código:
for(i=0;i<xml_.getElementsByTagName('caja').length;i++){
			alert('Titulo de la caja: ' + xml_.getElementsByTagName('caja')[i].getAttribute("titulo"));
			alert(xml_.getElementsByTagName('cuerpo')[i].firstChild.data);
}
El problema q tengo ahora es leer los del nivel siguiente:
Código:
<pagina encabezado="Prueba con el XML completo">
<caja id="1" titulo="Caja numero Uno ">
	<cuerpo>Uno Uno Uno Uno Uno Uno Uno Uno Uno Uno Uno</cuerpo>
	   <fotos>
		   <imagen archivo="playa.jpg" alt="Foto de la playa" />
		   <imagen archivo="campo.jpg" alt="Foto del campo" />
	   </fotos>
	   <enlaces>
		   <web enlace="www.forosdelweb.com"  frase="Pincha Aqui"/>
                           <web enlace="ww.google.es"  frase="Google"/>
	   </enlaces>

</caja>
</pagina>
es decir, llegar a el tag imagen. En explorer puedo llegar al atributo imagen a traves de xml_.getElementsByTagName('fotos')[i].childNodes[0].getAttribute("archivo"); en mozilla recibo un error que dice Error: xml_.getElementsByTagName("fotos")[i].childNodes[0].getAttribute is not a function.
Así está esto hasta ahora a la espera de vuestras ideas.
Un saludo.
  #16 (permalink)  
Antiguo 13/07/2005, 06:56
 
Fecha de Ingreso: febrero-2003
Mensajes: 109
Antigüedad: 21 años, 9 meses
Puntos: 0
Aleluyaaaaa

Bueno, después de horas dándole vueltas y más vueltas di con la solucion (mientras no se demuestre lo contrario). El problema es q iba demasiado deprisa y había que separar poco a poco las variables que guardan los nodos, es decir, para llegar a
Código:
xml_.getElementsByTagName('fotos')[i].childNodes[0].getAttribute("archivo");
habia que pasar por
Código:
fotos=xml_.getElementsByTagName('fotos')[i];
			numfotos=fotos.getElementsByTagName('imagen').length;
			for(s=0;s<numfotos;s++){
			alert(fotos.getElementsByTagName('imagen')[s].getAttribute("archivo"));
habia que guardar el primer nodo en una variable y luego usar esa variable como raiz.
Bueno, espero que esto ayude a alguien más.
Un saludo.
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 10:52.