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

Parse XML with namespace prefix in vb .net

我是 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>

XML 从 POST 请求返回并保存在变量中。我想提取所有 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

我的问题是值总是 "Nothing"。我尝试了不同的方法,但 none 有效,但我不知道为什么。我认为这与名称空间前缀有关。

立即问题出在您的 XPath 表达式中:

Dim value = doc.SelectSingleNode("/tns:keyvalue", nsm).InnerText

那只是在寻找名为 keyvalueroot 元素。如果您更改它以查找后代,您将找到第一个 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