在vb.net中解析带有名称空间前缀的XML

在vb.net中解析带有名称空间前缀的XML,.net,xml,vb.net,namespaces,prefix,.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.IKeyItemListD

我是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>
我的问题是价值总是“无”。我尝试了不同的方法,但没有成功,我也不知道为什么。我认为这与名称空间前缀有关。

直接的问题在于XPath表达式:

Dim value = doc.SelectSingleNode("/tns:keyvalue", nsm).InnerText
这只查找名为
keyvalue
的根元素。如果将其更改为查找子体,则会找到第一个
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

您是否必须使用XmlDocument而不是linqtoxml(XDocument等)?LINQtoXML在IMO中有更干净的命名空间支持。我不知道这是什么。为此,我翻阅了一些旧书。LINQ to XML是一种更现代的XML API。如果可能的话,我强烈建议你使用它。谢谢你的帖子。使用SelectNodes的解决方案有效。但是我不能让林克去工作。告诉我XDocument未定义。试图导入某些类,但System.Xml.Linq不存在。@mirokai:只要您使用.NET 3.5或更高版本,导入
System.Xml.Linq应该可以正常工作。(您可能需要添加一个程序集引用,但这将完全取决于您正在编写的项目类型,以及您所针对的框架版本,因为我相信随着时间的推移,它的位置会发生变化。)
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