Wie Verwenden von XPath in Yahoo! Widgets, einen Baum zu durchqueren?
-
05-07-2019 - |
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>
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 < 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