Question

Je crée un Yahoo! Widget et l’avez déjà fait sans problème (création d’un widget). Je reçois un document XML via un lien Web et je souhaite que tous les nœuds soient intégrés à un arbre. Je fais ça:

var request = new XMLHttpRequest();
        request.open( "GET", url, false );
        request.send();
        if ( request.status == 200 )
        {
            doc = request.responseXML;
            tree = doc.evaluate("/lfm");
            status = tree.item(0).getAttribute("status")
            if(status == "ok")
            {
                print ("status is ok!");
                tracks = doc.evaluate("/lfm/recenttracks[1]/track");
                for(i=0;i<tracks.length;i++)
                {
                    artist = tracks.item(i).firstChild.firstChild.data;
                }
            }
        }
    }

Ainsi, vous pouvez extraire le noeud artiste de l'arborescence . Si vous souhaitez avoir le prochain frère , vous rencontrez un problème. Vous devez appeler

tracks.item(i).firstChild.nextSibling.firstChild.data;
tracks.item(i).firstChild.nextSibling.nextSibling.firstChild.data;
tracks.item(i).firstChild.nextSibling.nextSibling.nextSibling.firstChild.data;

pour que cela soit fait. Le nœud à côté de celui-ci y ajoute un «dialogue négatif» , etc. Je ne veux pas continuer à ajouter ces nœuds et je pensais qu'il serait possible d'utiliser childNodes [i] comme ceci:

artist = tracks.item(i).childNodes[0].firstChild.data;
nextitem = tracks.item(i).childNodes[1].firstChild.data;

cela ne fonctionne pas bien. elle retourne "les nœuds enfants [0] n'ont pas de propriétés" , quelle que soit la manière dont je les utilise. Maintenant, je pense qu’il existe aussi un moyen dans Xpath de le faire dans une boucle for:

name = doc.evaluate("string(/lfm/recenttracks[1]/track["+i+"]/name)");
                    print(name);
othernode = doc.evaluate("string(/lfm/recenttracks[1]/track["+i+"]/album)");
                    print(othernode);

puis augmentez i pour la piste suivante. mais, d’une manière ou d’une autre, cela ne renvoie que un élément. il ne récupère pas plus d'éléments dans une boucle pour . i-1 ne fonctionne pas non plus.

Quelqu'un sait comment utiliser une expression Xpath avec ma valeur i pour choisir un nœud, puis obtenir les sous-nœuds par super nœud? Par titre , je souhaite obtenir un artiste, nom, streamable, mbid, album, url, image (petit), image (moyen), image (grand) et date.

mon fichier xml ressemble à ceci:

<lfm status="ok">
   <recenttracks user="xaddict">
      <track nowplaying="true"> 
         <artist mbid="f5b8ea5f-c269-45dd-9936-1fedf3c56851">The Presets</artist>
         <name>Girl (You Chew My Mind Up)</name>
         <streamable>1</streamable>
         <mbid></mbid>
         <album mbid="b150d099-b0f3-4feb-9a05-34e693c6dd24">Beams</album>
         <url>http://www.last.fm/music/The+Presets/_/Girl+%28You+Chew+My+Mind+Up%29</url>
         <image size="small">http://userserve-ak.last.fm/serve/34s/8696437.jpg</image>
         <image size="medium">http://userserve-ak.last.fm/serve/64s/8696437.jpg</image>
         <image size="large">http://userserve-ak.last.fm/serve/126/8696437.jpg</image>
         <date uts="1236440600">7 Mar 2009, 15:43</date>
      </track>
      <track > 
         <artist mbid="f5b8ea5f-c269-45dd-9936-1fedf3c56851">The Presets</artist>
         <name>Get Outta Here</name>
         <streamable>1</streamable>
         <mbid></mbid>
         <album mbid="0469956f-d895-4120-8ec5-29ad41b9e2fd">Blow Up</album>
         <url>http://www.last.fm/music/The+Presets/_/Get+Outta+Here</url>
         <image size="small">http://userserve-ak.last.fm/serve/34s/20923179.png</image>
         <image size="medium">http://userserve-ak.last.fm/serve/64s/20923179.png</image>
         <image size="large">http://userserve-ak.last.fm/serve/126/20923179.png</image>
         <date uts="1236440242">7 Mar 2009, 15:37</date>
      </track>
   </recenttracks>
</lfm>
Était-ce utile?

La solution 3

La méthode entièrement compatible avec Xpath consiste à utiliser la conversion de chaîne dans Xpath. J'ai déjà posté ce code comme réponse à une autre question et je le referai. Je suis très heureux d'avoir découvert cette façon de faire.

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

Essayez ceci

 for (var i = 0; i < xmlDoc.getElementsByTagName('track').length; i++)
            {
                alert(xmlDoc.getElementsByTagName('track')[i].getElementsByTagName('name')[0].childNodes[0].nodeValue); 
            }

si vous souhaitez utiliser xpath, vous pouvez également essayer la solution ci-dessous.

var s = xmlDoc.evaluate( '//track' ,xmlDoc, null, XPathResult.ANY_TYPE, null );
var track = s.iterateNext();

while (track)
{
     alert(track.getElementsByTagName('name')[0].textContent );
     track = s.iterateNext();
}

Pouvez-vous poster le fragment XML correspondant? Nous examinons votre code qui l’analyse, mais si nous avions le code XML lui-même, il serait plus facile de contrer une requête Xpath. Le plus utile serait le bit qui contient des éléments tels que

<lfm>
    <recenttracks>
        <track>
            <album>

etc

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