【发布时间】:2015-03-27 22:25:55
【问题描述】:
我在 Visual Basic 中的“SelectSingleNode”函数遇到问题。
我有以下 XML 文件:
<sistema versao="1.02" xmlns="http://www.portalfiscal.inf.br/nfe">
<det>
<prod>
<cProd>000085</cProd>
<xProd>MARTELO</xProd>
<NCM>73170090</NCM>
<uCom>UN</uCom>
<vUnCom>7.0000</vUnCom>
</prod>
<imposto>
<ICMS>
<orig>0</orig>
<CST>500</CST>
</ICMS>
</imposto>
</det>
</sistema>
我需要节点“cProd”内的值。在这种情况下,“000085”。
我尝试了以下代码:
Public Sub importacao()
Dim arquivos = CheckedListBox1.CheckedItems
Dim total = arquivos.Count
Dim nome_produto As String
For i As Integer = 0 To total - 1
Dim xml As New XmlDocument
xml.Load(arquivos.Item(i))
nome_produto = xml.ChildNodes(0).ChildNodes(0).ChildNodes(0).SelectSingleNode("cProd").InnerText
Next
End Sub
在“arquivos”中是一个带有 XML 文件路径的 CheckBoxList。
返回错误“对象引用未设置为对象的实例”。因为“SelectSingleNode("cProd")”返回的是空值。
我认为我错误地放置了 XPath。有人可以帮我吗?
谢谢你,对不起我的英语。
编辑:
它起作用了,我使用了一个函数来删除命名空间(来源:http://rprateek.blogspot.com.br/2011/01/how-to-remove-xmlns-namespace-from-xml.html)。然后我可以使用以下内容:xml.ChildNodes(0).SelectSingleNode("//cProd").InnerText
还有一件事。如果文件中不存在标签“cProd”(或另一个标签),那么处理可能导致的错误的最实用方法是什么?例如,在某些文件中,不会有标签“NCM”。也许我可以用“GetElementsByTagName()”验证标签是否存在?
谢谢大家。
【问题讨论】:
-
您的示例实际上是无效的 XML。如果
<det>是<prod>的父节点,那么您最后缺少</det>;如果它是一个空节点,它应该是<det />。顺便说一句,SelectSingleNode允许您指定整个 XPath,因此您不需要像以前那样做。 -
对不起,我把 XML 放在这里的时候出现了问题。现在好啦。关于 XPath,你能告诉我一个在这种情况下如何做的例子吗?谢谢。
-
你为什么要跳槽?
xml.ChildNodes(0).SelectSingleNode("//cProd")或SelectSingleNode("/det/prod/cProd")应该都适合你。