如何从XML中选择特定节点

时间:2015-11-22 08:13:08

标签: xml vb.net xmldocument

我有这个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给出正确的路径。

2 个答案:

答案 0 :(得分:2)

那是因为您的XML具有默认命名空间:xmlns="urn:somethinghere"。这个主题(针对具有默认命名空间的XML的XPath查询)在SO中已经多次以各种形式被问过。以下是我的回答历史中的一些内容:

  1. Parse XML with succint syntax
  2. Use XPath with XML namespace
  3. Get value of single node yields "... value of Nothing"
  4. 这是使用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,你可以使用你想要的任何东西作为临时前缀。

感觉应该有一种让它识别默认命名空间的方法,但由于某种原因,在其上添加文件名称表并不能识别它,但给它起了个名字会工作的。