在vb .net中使用名称空间前缀解析XML

时间:2018-04-23 09:53:06

标签: .net xml vb.net namespaces prefix

我对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;。我尝试了不同的东西,但没有工作,我不知道为什么。我认为它与名称空间前缀有关。

1 个答案:

答案 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