Pregunta

Me estoy poniendo un archivo XML y desee obtener datos de él. La fuente del xml en realidad no importa, pero lo que yo; VE consiguió obtener un determinado campo es:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

Ahora bien, esto funciona como un encanto, excepto cuando no hay ningún valor en el nodo. Así que si la estructura es la siguiente:

<xml>
 <one>
  <two>nodeValue</two>
 </one>
 <one>
  <two></two>
 </one>
</xml>

el widget se colgará en la segunda 'uno' nodo, porque no hay valor en el 'dos' nodo. La consola dice:

TypeError: tracks.item(i).childNodes.item(4).childNodes.item(0) has no properties

¿Alguna idea sobre cómo obtener el widget para ver simplemente vacía como una cadena vacía (nulo, vacío, o ""), en lugar de estrellarse? Supongo que algo en la línea de datos , getValue () , texto , o algo más.

utilizando

var track= xmlDoc.getElementsByTagName('track')[0];
var info= track.getElementsByTagName('artist')[0];
var value= info.firstChild? info.firstChild.data : '';

no funciona y devuelve "TypeError: pista no tiene propiedades". Eso es desde la segunda línea, donde el artista se llama.

¿Fue útil?

Solución 3

Yahoo! Reproductores no implementa todas las funciones javascript básicos necesarios para poder utilizar el navegador de código en un widget.

en lugar de utilizar:

tracks = xmlDoc.getElementsByTagName("track");
variable = tracks.item(i).childNodes.item(4).childNodes.item(0).nodeValue;

para obtener valores que es mejor usar Xpath con una conversión directa en cadena. Cuando una cadena está vacía en Yahoo! Widgets no da ningún fallo, pero devuelve el 'vacío'. innerText y textContent (la forma básica JavaScript en los navegadores, se utiliza junto con cosas como getElementsByTagName) no están totalmente (o en absoluto) implementados en el Yahoo! Reproductores de motor y hacer que funcione más lento y bastante terriblemente reaccionan a XMLNodes y childNodes. una manera fácil sin embargo para atravesar una estructura XML documento está utilizando 'evaluar' para obtener todo lo necesario (incluyendo listas de nodos) del XML.

Después de enterarse de esto, mi solución era hacer todo mucho más fácil y menos sensible a los fallos y errores. También elegí para poner los objetos en una matriz para hacer más fácil trabajar con ellos.

            var entries = xmlDoc.evaluate("lfm/recenttracks/track");
            var length = entries.length;
            for(var i = 0; i &lt; length; i++) {
                var entry = entries.item(i);
                var obj = {
                    artist: entry.evaluate("string(artist)"),
                    name: entry.evaluate("string(name)"),
                    url: entry.evaluate("string(url)"),
                    image: entry.evaluate("string(image[@size='medium'])")
                    };
                posts[i] = obj;
            }

Otros consejos

Prueba de que el ‘dos’ nodo tiene un nodo secundario antes de acceder a sus datos.

childNodes.item (i) (o el código JavaScript sencillo formulario childNodes [i]) generalmente se deben evitar, que es un poco frágil depender de los nodos de texto de espacio en blanco estar en el lugar esperado exacto.

Me gustaría hacer algo como:

var tracks= xmlDoc.getElementsByTagName('track')[0];
var track= tracks.getElementsByTagName('one')[0];
var info= track.getElementsByTagName('two')[0];
var value= info.firstChild? info.firstChild.data : '';

(Si no conoce los identificadores de 'uno' y 'dos' de antelación, siempre se puede utilizar 'getElementsByTagName (' * ')' para obtener todos los elementos, siempre y cuando no es necesario para apoyar IE5, donde esto no funciona.)

Una alternativa a la última línea es el uso de un método para leer todos el texto dentro del nodo, incluyendo cualquiera de sus nodos secundarios. Esto no importa si el nodo solamente siempre contiene como máximo un nodo de texto, pero puede ser útil si el árbol puede conseguir desnormalizaremos o contienen EntityReferences o elementos anidados. Históricamente uno tenía que escribir un método recursivo para obtener esta información, pero en estos días la mayoría de los navegadores soportan la propiedad textContent DOM Nivel 3 y / o la extensión innerText de IE:

var value= info.textContent!==undefined? info.textContent : info.innerText;

sin un DTD que permite una elemento para contener un elemento de dos vacío , que tendrá que analizar y violín el texto de su XML para obtener un documento de eso.

Los elementos vacíos son como valores nulos en databases- puesta en algo, un "nada" o el valor "0", un espacio duro, nada en absoluto- o no incluyen los dos elementos .

Tal vez podría ser un atributo un , en lugar de un elemento en su propio derecho. Los atributos pueden tener cadenas vacías para los valores. Mejor que los elementos fantasma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top