我对vb .net很新,自从我处理XML解析以来已经很长时间了。
我收到了以下XML文件:
<?xml version="1.0" encoding="ISO-8859-15"?>
<tns:keyitem_list_test xmlns:tns="http://someurl.com/abc/def">
<tns:name>test.keyitem</tns:name>
<tns:type>test.IKeyItemListDataObject</tns:type>
<tns:keyitem>
<tns:cataloge>testCat</tns:cataloge>
<tns:seq_nr>1</tns:seq_nr>
<tns:keyvalue>01</tns:keyvalue>
<tns:keyvalue_alt>test1</tns:keyvalue_alt>
<tns:keytext>test text 1</tns:keytext>
<tns:keyhelpertext />
<tns:is_temp>false</tns:is_temp>
</tns:keyitem>
<tns:keyitem>
<tns:cataloge>testCat</tns:cataloge>
<tns:seq_nr>2</tns:seq_nr>
<tns:keyvalue>02</tns:keyvalue>
<tns:keyvalue_alt>test2</tns:keyvalue_alt>
<tns:keytext>test text 2</tns:keytext>
<tns:keyhelpertext />
<tns:is_temp>false</tns:is_temp>
</tns:keyitem>
...
</tns:keyitem_list_test>
从POST请求返回XML并保存在变量中。我想提取所有tns:keyvalue标签。
Dim doc = New Xml.XmlDocument()
doc.LoadXml(retVal.return)
Dim nsm = New Xml.XmlNamespaceManager(doc.NameTable)
nsm.AddNamespace("tns", "http://someurl.com/abc/def")
Dim value = doc.SelectSingleNode("/tns:keyvalue", nsm).InnerText
我的问题是价值总是&#34;没什么&#34;。我尝试了不同的东西,但没有工作,我不知道为什么。我认为它与名称空间前缀有关。
答案 0 :(得分:1)
立即问题出现在XPath表达式中:
Dim value = doc.SelectSingleNode("/tns:keyvalue", nsm).InnerText
仅查找名为keyvalue
的 root 元素。如果您更改它以查找后代,您将找到第一个keyvalue
节点:
Dim value = doc.SelectSingleNode("//tns:keyvalue", nsm).InnerText
或者寻找所有节点而不仅仅是第一个节点:
Dim nodes = doc.SelectNodes("//tns:keyvalue", nsm)
For Each node as Xml.XmlNode in nodes
Console.WriteLine(node.InnerText)
Next
但是,如果可以的话,我建议使用LINQ to XML,它具有更清晰的命名空间支持,并且在不使用XPath的情况下更好地支持查询:
Dim doc = XDocument.Parse(retVal.return)
Dim ns As XNamespace = "http://someurl.com/abc/def"
Dim elements = doc.Descendants(ns + "keyvalue")
For Each element in elements
Console.WriteLine(element.Value)
Next