0

我正在创建一个Yahoo! 小部件,并且之前没有任何问题(创建小部件)。我正在通过网络链接获取xml 文档,并希望将所有节点引入树中。我正在这样做:

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

这样您就可以将节点艺术家中取出。但是,如果您想拥有下一个兄弟姐妹,那就有问题了。你必须打电话

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

完成这项工作。旁边的节点会为其添加“nextsibling”,依此类推。我不想继续添加这些节点,并认为可以像这样使用childNodes[i]

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

这虽然行不​​通。它以我使用它的任何方式返回“childNodes [0] 没有属性”现在我认为Xpath中还有一种方法可以在 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);

然后为下一首曲目增加i 。但不知何故,这只返回一项。它不会在for循环中检索更多项目。i-1也不起作用。

任何人都知道如何使用带有我的 i 值的 Xpath 表达式来选择一个节点,然后获取每个超节点的子节点?每首曲目我想获取艺术家、姓名、流媒体、mbid、专辑、网址、图像(小)、图像(中)、图像(大)日期。

我的 xml 文件如下所示:

<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>
4

3 回答 3

2

试试这个

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

如果您想使用 xpath,您也可以尝试以下解决方案。

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();
}
于 2009-03-07T19:44:56.947 回答
0

您可以发布相关的 XML 片段吗?我们正在查看解析它的代码,但如果我们有 XML 本身,那么构建 Xpath 查询会更容易。最有用的是具有以下元素的位

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

ETC

于 2009-03-07T16:34:35.890 回答
0

完全启用 Xpath 的方法是使用 Xpath 中的字符串转换。我已经将此代码发布为另一个问题的答案,并将再次执行此操作。我很高兴我发现了这种做事方式。

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;
}
于 2009-03-27T15:33:30.347 回答