Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从web服务读取xml节点值_Xml_Vb.net_Last.fm - Fatal编程技术网

从web服务读取xml节点值

从web服务读取xml节点值,xml,vb.net,last.fm,Xml,Vb.net,Last.fm,我正在尝试从lastfm web服务读取如下所示的xml节点值: <lfm status="ok"> <results for="stinkfist" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> <opensearch:Query role="request" searchTerms="stinkfist" startPage="1" /> <opensearch:totalRe

我正在尝试从lastfm web服务读取如下所示的xml节点值:

<lfm status="ok"> 
<results for="stinkfist" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"> 
<opensearch:Query role="request" searchTerms="stinkfist" startPage="1" /> 
<opensearch:totalResults>188</opensearch:totalResults> 
<opensearch:startIndex>0</opensearch:startIndex> 
<opensearch:itemsPerPage>1</opensearch:itemsPerPage> 
<trackmatches> 
<track> 
    <name>Stinkfist</name> 
    <artist>Tool</artist> 
    <url>http://www.last.fm/music/Tool/_/Stinkfist</url> 
    <streamable fulltrack="0">1</streamable> 
    <listeners>290583</listeners> 
         <image size="small">http://userserve-ak.last.fm/serve/34s/24508457.jpg</image> 
    <image size="medium">http://userserve-ak.last.fm/serve/64s/24508457.jpg</image> 
    <image size="large">http://userserve-ak.last.fm/serve/126/24508457.jpg</image> 
    <image size="extralarge">http://userserve-ak.last.fm/serve/300x300/24508457.jpg</image> 
 <mbid></mbid> 
</track> 
</trackmatches> 
</results>
</lfm>
但是当我运行页面时,我没有得到任何结果,页面是空的。。。
我做错了什么?

根据您向我们展示的XML,
不在名称空间中。但您正试图在opensearch名称空间中找到它们。尽管
有一个名称空间声明,但只有使用
opensearch:
名称空间前缀的元素(或属性)实际位于该名称空间中

因此,您需要从中删除名称空间前缀

nodes = doc.SelectNodes("lastfm:results/lastfm:trackmatches/lastfm:track", ns)
即将其更改为(已删除;见下文)

更新:反映对输入XML的编辑:由于顶级元素不是
,而是
,请执行以下操作:

nodes = doc.SelectNodes("/*/results/trackmatches/track")

另请参阅@Garett关于尝试将子元素当作属性来选择的优点。

我看到了几个问题

首先,您不需要添加名称空间
lastfm
opensearch
(如果需要访问这些元素)

所以这一行:

ns.AddNamespace("lastfm", "http://a9.com/-/spec/opensearch/1.1/")
将成为:

ns.AddNamespace("opensearch", "http://a9.com/-/spec/opensearch/1.1/")
如果您需要访问
opensearch
元素,您可以像这样使用它:

doc.SelectSingleNode("lfm/results/opensearch:totalResults", ns).InnerText
要选择
轨迹
节点,您的查询应该是:

nodes = doc.SelectNodes("/lfm/results/trackmatches/track")
轨迹节点没有属性,因此
node.attributes(“name”).InnerText将不起作用。相反,它们有子元素(节点),因此要获取这些值,可以执行以下操作:

node.SelectSingleNode("name").InnerText
甚至更短的语法

node("name").InnerText
综上所述,您的程序如下所示:

Dim doc As XmlDocument
Dim ns As XmlNamespaceManager
Dim nodes As XmlNodeList

doc = New XmlDocument()
doc.Load("http://ws.audioscrobbler.com/2.0/?method=track.search&track=Believe&api_key=b25b959554ed76058ac220b7b2e0a026")
ns = New XmlNamespaceManager(doc.NameTable)
ns.AddNamespace("opensearch", "http://a9.com/-/spec/opensearch/1.1/")
nodes = doc.SelectNodes("/lfm/results/trackmatches/track")
Dim str As String = String.Empty
For Each node As XmlNode In nodes
    str += node.SelectSingleNode("name").InnerText
    str += node.SelectSingleNode("artist").InnerText
    str += node.SelectSingleNode("url").InnerText
    str += node.SelectSingleNode("listeners").InnerText
Next

最后,MSDN在使用XPath和方面做得非常好,您可能会发现这很有用。

做了,但仍然没有结果……也许可以用其他方法来获取这些节点值?并且@tone:根据响应,没有默认名称空间。所以@LarsH的答案是正确的。但是应该是:
/lfm/results/trackmatches/track
@tone,我现在编辑了我的答案,以反映您在输入XML中所做的更改。
Dim doc As XmlDocument
Dim ns As XmlNamespaceManager
Dim nodes As XmlNodeList

doc = New XmlDocument()
doc.Load("http://ws.audioscrobbler.com/2.0/?method=track.search&track=Believe&api_key=b25b959554ed76058ac220b7b2e0a026")
ns = New XmlNamespaceManager(doc.NameTable)
ns.AddNamespace("opensearch", "http://a9.com/-/spec/opensearch/1.1/")
nodes = doc.SelectNodes("/lfm/results/trackmatches/track")
Dim str As String = String.Empty
For Each node As XmlNode In nodes
    str += node.SelectSingleNode("name").InnerText
    str += node.SelectSingleNode("artist").InnerText
    str += node.SelectSingleNode("url").InnerText
    str += node.SelectSingleNode("listeners").InnerText
Next