2009-03-07 2 views
0

Ich erstelle eine Yahoo! Widget und habe dies vorher ohne Probleme (Erstellen eines Widgets) getan. Ich bekomme ein XML-Dokument über einen Weblink und möchte alle Knoten intro einen Baum bekommen. Ich tue dies:Wie verwende ich Xpath in Yahoo! Widgets, um einen Baum zu überqueren?

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 Künstler aus demBaum erhalten. Es gibt jedoch ein Problem, wenn Sie die nächsten Geschwister haben wollen. Sie müssen

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

aufrufen, um dies zu tun. Der Knoten daneben fügt 'nexsibling' hinzu und so weiter. Ich will nicht auf halten diese Knoten hinzugefügt und dachte, es wäre möglich, childnodes [i] wie folgt zu verwenden:

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

dies allerdings nicht funktioniert. es gibt zurück "childNodes [0] hat keine Eigenschaften" in welcher Art auch immer ich es verwende. Jetzt denke ich, es ist auch ein Weg in Xpath dies in einer for-Schleife zu tun:

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 i für die nächste Spur zu erhöhen. aber irgendwie gibt das nur eins Artikel zurück. Es ruft nicht mehr Elemente in einer für-Schleife. i-1 funktioniert auch nicht.

Wer weiß, wie man einen Xpath-Ausdruck mit meinem i-Wert verwendet, um einen Knoten auszuwählen und dann die Unterknoten pro Superknoten zu bekommen? Per spur ich möchte künstler, name, streamable, mbid, album, url, bild (klein), bild (mittel), bild (groß) und daten.

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> 
+0

ein Beispiel für Ihre Quell-XML und was Sie daraus erhalten möchten, würde helfen. –

+0

fertig, siehe das hinzugefügte xml! – xaddict

+0

und wieder, was willst du daraus machen? –

Antwort

0

Die vollständig Xpath-fähige Möglichkeit, dies zu tun, verwendet die Zeichenfolge-Konvertierung in Xpath. Ich habe diesen Code bereits als Antwort auf eine andere Frage veröffentlicht und werde dies erneut tun.Ich bin sehr froh, dass ich von dieser Art von Dingen erfahren habe.

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

Können Sie das entsprechende XML-Fragment hinterlassen? Wir betrachten Ihren Code, der ihn analysiert, aber wenn wir das XML selbst hätten, wäre es einfacher, eine Xpath-Abfrage zu erstellen. Am nützlichsten wäre das Bit, das Elemente wie

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

etc

+0

erledigt. Die entsprechende XML wurde der Frage hinzugefügt – xaddict

2

Versuchen Sie, diese

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

hat, 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(); 
} 
+0

Ich möchte XPath verwenden, da es viel schneller in Yahoo! Widgets. SO ist das nicht wirklich eine Option. Danke trotzdem! – xaddict

+0

Ok, versuchen Sie den Startwert als 1 für den Xpath-Index. –

+0

Ich habe es gerade jetzt versucht und es scheint, dass beide Codes in normalem Javascript funktionieren, aber die erste gibt "TypeError: xmlDoc.getElementsByTagName (" track ") [0] hat keine Eigenschaften" in Yahoo! Widgets. Die zweite Rückkehr "Funktion s.iterateNext existiert nicht" – xaddict

Verwandte Themen