Pergunta

Estou recebendo um arquivo xml e deseja obter dados a partir dele. A fonte do xml realmente não importa, mas o que eu; tenho de obter um determinado campo é:

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

Agora Isso funciona como um encanto, exceto quando não há nenhum valor no nó. Então, se a estrutura é assim:

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

o widget irá falhar no segundo 'um' nó, porque não há nenhum valor no nó 'dois'. O console diz:

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

Algumas ideias sobre como obter o widget para ver apenas vazio como uma string vazia (nula, vazio, ou ""), em vez de deixar de funcionar? Eu estou supondo que algo ao longo das linhas de dados , getValue () , texto , ou algo mais.

usando

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

não funciona e retorna "TypeError: pista não tem propriedades". Que a partir da segunda linha onde artista é chamado.

Foi útil?

Solução 3

Yahoo! Widgets não implementar todas as funções básicas JavaScript necessário para ser capaz de usar navegador de código em um widget.

em vez de usar:

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

para obter valores é melhor usar XPath com uma conversão direta para string. Quando uma string é vazia no Yahoo! Widgets não dá quaisquer falhas, mas retorna o 'vazio'. innerText e textContent (a forma básica javascript em navegadores, usado juntamente com coisas como getElementsByTagName) não são totalmente (ou não) implementados no Yahoo! Widgets do motor e torná-lo correr mais lento e bastante terrivelmente reagir a XmlNodes e childNodes. uma maneira fácil, no entanto, atravessar uma estrutura XML Document está usando 'avaliar' para obter tudo o que você precisa (incluindo listas de gânglios) do xml.

Depois de descobrir isso, a minha solução foi fazer tudo muito mais fácil e menos sensível a falhas e erros. Também eu escolhi para colocar os objetos em uma matriz para tornar o trabalho com eles mais fácil.

            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;
            }

Outras dicas

Test que o ‘dois’ nó tem um nó filho antes de acessar seus dados.

childNodes.item (i) (ou a forma simples childNodes JavaScript [i]) devem ser evitadas, é um pouco frágil confiando em nós de texto de espaço em branco estar no lugar exato esperado.

Eu faria 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 : '';

(Se você não sabe as tagnames de 'um' e 'dois' com antecedência, você pode sempre usar 'getElementsByTagName (' * ')' para obter todos os elementos, contanto que você não precisa de suporte IE5, onde isso não funciona.)

Uma alternativa para a última linha é usar um método para ler todas o texto dentro do nó, incluindo qualquer um dos seus nós filho. Isso não importa se o nó só já contém no máximo um nó de texto, mas pode ser útil se a árvore pode se Desnormaliza ou conter EntityReferences ou elementos aninhados. Historicamente era preciso escrever um método recursivo para obter essa informação, mas nos dias de hoje a maioria dos navegadores suportam a propriedade DOM Nível 3 textContent e / ou extensão innerText do IE:

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

sem um DTD que permite que um um elemento para conter um dois elemento vazio , você terá que analisar e mexer o texto de sua xml para obter um documento de isto.

Os elementos vazios são como valores nulos em databases- colocar em alguma coisa, um "Nada" ou "0" valor, um espaço rígido, qualquer coisa em todos os- ou não incluem os dois elemento .

Talvez poderia ser uma atributo de um , em vez de um elemento em sua própria direita. Os atributos podem ter cadeias vazias para valores. Melhor do que elementos fantasmas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top