我有这个XML:
<?xml version="1.0"?>
<Document xmlns="urn:somethinghere">
<fapx.001.02>
<Sts>
<StsVal>ACCEPTED</StsVal>
</Sts>
</fapx.001.02>
</Document>
我想选择“StsVal”的值,为此我写了这段代码,但收到错误:
代码
Dim doc As XmlDocument = New XmlDocument()
doc.Load("myfile.xml")
Dim response As String = doc.SelectSingleNode("Document/fapx.001.02/Sts/StsVal").InnerText
错误
对象引用未设置为对象的实例。
修改
我知道由于Nulll值而导致此错误可能是因为我在SelectSingleNode函数中给出的路径不正确。这就是为什么我想知道如何基于给定的XML给出正确的路径。
答案 0 :(得分:2)
那是因为您的XML具有默认命名空间:xmlns="urn:somethinghere"
。这个主题(针对具有默认命名空间的XML的XPath查询)在SO中已经多次以各种形式被问过。以下是我的回答历史中的一些内容:
这是使用XPath和XmlDocument
查询命名空间中元素的一种可能方法:
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("d", "urn:somethinghere")
Dim doc As XmlDocument = New XmlDocument()
doc.Load("myfile.xml")
Dim response As String = doc.SelectSingleNode("d:Document/d:fapx.001.02/d:Sts/d:StsVal", nsManager).InnerText
答案 1 :(得分:2)
您的问题是您的文档有一个默认命名空间,但XPath表达式并没有使用它。您可以传入命名空间管理器并使用命名空间的别名,如下所示:
Dim xnm as XmlNamespaceManager = New XmlNamespaceManager( doc.NameTable )
xnm.AddNamespace("ns", "urn:somethinghere")
Dim response As String = doc.SelectSingleNode("ns:Document/ns:fapx.001.02/ns:Sts/ns:StsVal", xnm).InnerText
我的vb有点生疏,如果语法需要稍微调整就道歉,但希望你明白了。 &#34; ns&#34;如果是abritrary,你可以使用你想要的任何东西作为临时前缀。
感觉应该有一种让它识别默认命名空间的方法,但由于某种原因,在其上添加文件名称表并不能识别它,但给它起了个名字会工作的。