Frage

Ich erstelle einen Yahoo! Widget und habe dies getan, vor ohne Probleme (Erstellen eines Widgets). Ich erhalte eine XML-Dokument über einen Weblink und wollen alle Knoten einen Baum intro erhalten. Ich tue dies:

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

Auf diese Weise können Sie den Knoten bekommen Künstler aus dem Baum . es gibt ein Problem, obwohl, wenn Sie die nächsten Geschwister haben wollen . Sie müssen rufen

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

dies getan. Der Knoten neben fügt hinzu, dass ein ‚nextSibling‘ , um es und so weiter. Ich will nicht auf halten diese Knoten hinzugefügt und dachte, es wäre möglich, childnodes zu verwenden [i] wie folgt aus:

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

das nicht funktioniert, though. es gibt "childnodes [0] hat keine Eigenschaften" in welcher Weise auch immer ich es verwenden. Jetzt denke ich, es ist auch ein Weg in Xpath tun dies in einer for-Schleife:

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

und dann zu erhöhen i für die nächste Spur. aber irgendwie gibt nur ein Element. es nicht abrufen nicht mehr Elemente in einem für -loop. i-1 funktioniert auch nicht.

Jeder weiß, wie einen XPath-Ausdruck mit meinem i-Wert zu verwenden, um einen Knoten zu wählen und dann die untergeordneten Knoten pro Supernode bekommen? Per Spur Ich will bekommen Künstler, Name, streambare, MBID, Album, url, Bild (klein), Bild (mittel), Bild (groß) und Datum.

meine XML-Datei sieht wie folgt aus:

<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>
War es hilfreich?

Lösung 3

der vollständig XPath-fähige Weg, dies zu tun, die String-Konvertierung in Xpath verwendet. Ive bereits gebucht diesen Code als Antwort auf eine andere Frage und wird dies wieder tun. Ich bin sehr froh, dass ich über diese Art, die Dinge herausgefunden.

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

Andere Tipps

Versuchen Sie, diese

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

Wenn Sie XPath verwenden möchten, können Sie auch die unten Lösung versuchen.

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

Können Sie das entsprechende XML-Fragment hinterlassen? Wir suchen auf den Code, der es analysiert, aber wenn wir das XML selbst hätte, würde es einfacher, Nachteile auf eine XPath-Abfrage sein. Am nützlichsten wäre das Bit sein, die Elemente wie

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

etc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top