在 vb .net 中使用名称空间前缀解析 XML
Posted
技术标签:
【中文标题】在 vb .net 中使用名称空间前缀解析 XML【英文标题】:Parse XML with namespace prefix in vb .net 【发布时间】:2018-04-23 09:53:06 【问题描述】:我对 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
我的问题是价值总是“无”。我尝试了不同的东西,但没有奏效,我不知道为什么。我认为这与命名空间前缀有关。
【问题讨论】:
您是否有使用 XmlDocument 而不是 LINQ to XML(XDocument 等)? LINQ to XML 具有更清晰的命名空间支持 IMO。 我不知道那是什么。为此,我翻阅了一些旧书。 LINQ to XML 是一种更现代的 XML API。如果可以的话,我强烈推荐使用它。 【参考方案1】:直接问题在于您的 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
【讨论】:
感谢您的帖子。 SelectNodes 的解决方案有效。但我无法让 Linq 工作。告诉我 XDocument 没有定义。尝试导入一些类,但 System.Xml.Linq 不存在。 @mirokai:只要您使用 .NET 3.5 或更高版本,导入System.Xml.Linq
应该可以正常工作。 (您可能需要添加一个程序集引用,但这完全取决于您正在编写什么样的项目,以及您所针对的框架版本,因为我相信它会随着时间的推移而改变位置。)以上是关于在 vb .net 中使用名称空间前缀解析 XML的主要内容,如果未能解决你的问题,请参考以下文章
XML 和 XSL 中的前缀命名空间处理由 XML 解析器返回错误
如何在PowerShell中添加XML名称空间作为属性前缀?