Comment puis-je obtenir mon widget de ne pas se bloquer s'il n'y a pas de valeur dans un noeud XML?

StackOverflow https://stackoverflow.com/questions/671861

Question

Je reçois un fichier xml et que vous souhaitez obtenir des données de celui-ci. La source du xml n'a pas d'importance, mais ce que je, ai eu pour obtenir un certain champ est:

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

Maintenant, cela fonctionne comme un charme, sauf quand il n'y a pas de valeur dans le nœud. Donc, si la structure est comme ceci:

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

le widget plantera sur le second « un » nœud, car il n'y a pas de valeur dans le nœud « deux ». La console dit:

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

Toutes les idées sur la façon d'obtenir le widget juste voir vide comme une chaîne vide (null, vide, ou « »), au lieu de se briser? Je devine que quelque chose le long des lignes de données , getValue () , text , ou autre chose.

en utilisant

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

ne fonctionne pas et retourne « TypeError: piste n'a pas de propriétés ». C'est de la deuxième ligne où l'artiste est appelé.

Était-ce utile?

La solution 3

Yahoo! Widgets n'implémente toutes les fonctions javascript de base nécessaires pour pouvoir utiliser le code du navigateur dans un widget.

au lieu d'utiliser:

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

pour obtenir des valeurs, il est préférable d'utiliser XPath avec une conversion directe à chaîne. Lorsqu'une chaîne est vide dans Yahoo! Widgets il ne donne pas de défauts, mais renvoie le « vide ». innerText et textContent (comme le javascript de base dans les navigateurs, utilisé aux côtés des choses comme getElementsByTagName) ne sont pas entièrement (ou pas du tout) mis en œuvre dans le Yahoo! Widgets Engine et le faire fonctionner plus lentement et réagissent tout à fait terriblement à XMLNodes et childNodes. un moyen facile cependant de traverser une structure de document XML utilise « évaluer » pour obtenir tout ce dont vous avez besoin (y compris les listes de noeuds) du xml.

Après avoir trouvé ceci, ma solution était de faire tout beaucoup plus facile et moins sensible aux défauts et erreurs. Aussi j'ai choisi de mettre les objets dans un tableau pour rendre le travail plus faciles.

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

Autres conseils

Vérifiez que le nœud « deux » a un nœud enfant avant d'accéder à ses données.

childNodes.item (i) (ou childNodes simple formulaire JavaScript [i]) doivent être évités en général, il est un peu fragile reposant sur des noeuds de texte contenant des espaces se trouvant dans exactement lieu prévu.

Je ferais quelque chose comme:

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 vous ne connaissez pas les tagnames de « un » et « deux » à l'avance, vous pouvez toujours utiliser « getElementsByTagName ( » * « ) » pour obtenir tous les éléments, aussi longtemps que vous n'avez pas besoin de soutenir IE5, où cela ne fonctionne pas.)

Une alternative à la dernière ligne est d'utiliser une méthode de lecture tous le texte à l'intérieur du noeud, y compris l'un de ses nœuds enfants. Cela n'a pas d'importance si le noeud ne contient jamais au plus un noeud de texte, mais peut être utile si l'arbre peut se dénormalisé ou contenir EntityReferences ou éléments imbriqués. Historiquement il fallait écrire une méthode récursion pour obtenir cette information, mais ces jours-ci la plupart des navigateurs prennent en charge DOM niveau 3 propriété textContent et / ou l'extension innerText IE:

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

sans dtd qui permet à un un élément pour contenir un vide deux éléments , vous devrez analyser et bidouiller le texte de votre xml pour obtenir un document sur il.

Les éléments vides sont comme des valeurs nulles dans databases- mettre quelque chose, un « rien » ou la valeur « 0 », un espace insécable, quoi que ce soit tout-ou ne comprennent pas l'élément deux .

Peut-être qu'il pourrait être un attribut un , au lieu d'un élément dans son propre droit. Les attributs peuvent avoir des chaînes vides pour les valeurs. Mieux que des éléments fantômes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top