Foros del Web » Programando para Internet » Javascript »

Parsear XML con dos etiquetas con el mismo nombre

Estas en el tema de Parsear XML con dos etiquetas con el mismo nombre en el foro de Javascript en Foros del Web. Hola Estoy parseando un XML de la siguiente manera: var items = xmlElement.getElementsByTagName("items"); var titulo= items[index].getElementsByTagName("titulo")[0]; titulos[index] = titulo.firstChild.data; Con un bucle voy metiendo los ...
  #1 (permalink)  
Antiguo 05/07/2011, 02:44
 
Fecha de Ingreso: julio-2011
Mensajes: 5
Antigüedad: 12 años, 9 meses
Puntos: 0
Pregunta Parsear XML con dos etiquetas con el mismo nombre

Hola

Estoy parseando un XML de la siguiente manera:

var items = xmlElement.getElementsByTagName("items");
var titulo= items[index].getElementsByTagName("titulo")[0];
titulos[index] = titulo.firstChild.data;

Con un bucle voy metiendo los valores en el array, esto funciona perfectamente.

El problema viene con un XML que tiene dos etiquetas "titulo" (no se por qué pero es así, tiene dos para cada "item").
Lo que quiero es coger uno de ellos, o concatenarlos y meter en el array el "titulo"+"titulo" ... pero así: titulo= items[index].getElementsByTagName("titulo")[0]; falla, el error que me da es "TypeError: titulo.firstChild is null", si cambio el XML y quito uno de los dos títulos funciona (decir que no puedo modificar el XML original, solo lo cambio para probar que funcione por mi cuenta).

Así que alguien sabe como ponerlo para que coja el valor de las etiquetas "titulo" cuando hay 2 (o más)?


Gracias!
  #2 (permalink)  
Antiguo 05/07/2011, 02:57
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Parsear XML con dos etiquetas con el mismo nombre

Hola:

Como todas las colecciones de datos (que son arrays), se puede usar el atributo length para saber el número de etiquetas iguales.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 05/07/2011, 05:01
 
Fecha de Ingreso: julio-2011
Mensajes: 5
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Parsear XML con dos etiquetas con el mismo nombre

Pero cómo obtengo la información? Ya que eso lo uso para coger los datos del XML pero el problema es que si una etiqueta aparece dos veces dentro de cada item me da error, como digo en el primer mensaje, si el XML es así me funciona todo:

<item start="201008062103">
<titulo lang="es">Batman Forever</titulo>
<descripcion lang="es">El hombre murcielago</descripcion>
<categoria>Pelicula</categoria>
</item>

Pero si es así me da el error "TypeError: titulo.firstChild is null"

<item start="201008062103">
<titulo lang="es">Batman</titulo>
<titulo lang="es">Forever</titulo>
<descripcion lang="es">El hombre murcielago</descripcion>
<categoria>Pelicula</categoria>
</item>
Se que es una tontería hacer el XML de la segunda manera, pero el que tengo que usar es así

Que debo cambiar en var titulo= items[index].getElementsByTagName("titulo")[0]; para que me funcione en el segundo XML al igual que en el primero?

Gracias
  #4 (permalink)  
Antiguo 06/07/2011, 01:17
 
Fecha de Ingreso: julio-2011
Mensajes: 5
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Parsear XML con dos etiquetas con el mismo nombre

Si alguien lo sabe que no dude en decirlo :)
  #5 (permalink)  
Antiguo 06/07/2011, 01:58
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Parsear XML con dos etiquetas con el mismo nombre

Hola:

Suponiendo que el tag item lo tienes en la variable este_item...

Código:
texto = [];
for (i = 0, titulos = este_item.getElementsByTagName("titulo"), total = titulos.length; i < total; i++) {
  texto.push(titulos[i].firstChild.data);
}
titulo = texto.join(" ");
La forma de hacerlo es en este caso, poniendo todos los títulos en el array texto, y luego concatenarlo con el método join de los arrays.

Fíjate que en la cabecera del bucle for (en la zona de inicialización), creo la variable titulo así:
titulos = este_item.getElementsByTagName("titulo")
y le sigue la inicialización de la variable total con el length...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 06/07/2011, 03:05
 
Fecha de Ingreso: julio-2011
Mensajes: 5
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Parsear XML con dos etiquetas con el mismo nombre

Gracias por responder! Parece que avanzo pero no lo termino de solucionar:

He puesto en marcha tu código y me da error:

TypeError: titulos[i].firstChild is null

Lo primero que hice es comprobar lo que vale titulos.length, y vale "2", por lo que parece que identifica las 2 etiquetas "titulo" que tiene mi XML.

Las etiquetas pueden estar vacías las 2, solo la primera o solo la segunda (o ninguna vacía), en mi caso el primer item tiene el primer titulo vacío y el segundo relleno.

No se si el error es porque la primera etiqueta titulo que pilla está vacía y da ese error, y claro, javascript se detiene ahí.

He intentado hacer esto que lo use en un caso que queria comprobar si el contenido de un array no estaba definido:

if (typeof titulos[i].firstChild.data != "") //o != null
{
texto.push(titulos[i].firstChild.data);
}
else
{
alert("titulo vacio");
}


pero nada, sigue dando el error de que es null y no sigue ..

es por eso el error? y si es así, como puedo hacer que si la etiqueta titulo está vacia no de error?

Gracias!
  #7 (permalink)  
Antiguo 06/07/2011, 03:50
 
Fecha de Ingreso: julio-2011
Mensajes: 5
Antigüedad: 12 años, 9 meses
Puntos: 0
Respuesta: Parsear XML con dos etiquetas con el mismo nombre

SOLUCIONADO

Lo hice así:

if (titulos[i].firstChild && titulos[i].firstChild.data )
{
texto.push(titulos[i].firstChild.data);

}else{

if (i == 0){ //primer titulo vacio
texto.push("");
}else{
texto.push(" - ");
}
}
}
titulo = texto.join(" ");


Saludos y gracias! :D

Etiquetas: parse, parsear, xml
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 12:25.