如何 select 来自 XML 的特定节点
How to select particular node from XML
我有这个XML:
<?xml version="1.0"?>
<Document xmlns="urn:somethinghere">
<fapx.001.02>
<Sts>
<StsVal>ACCEPTED</StsVal>
</Sts>
</fapx.001.02>
</Document>
我想要 select "StsVal" 的值,为此我编写了这段代码但出现错误:
代码
Dim doc As XmlDocument = New XmlDocument()
doc.Load("myfile.xml")
Dim response As String = doc.SelectSingleNode("Document/fapx.001.02/Sts/StsVal").InnerText
错误
Object reference not set to an instance of an object.
编辑
我知道我收到此错误是由于 Null 值,可能是因为我在 SelectSingleNode 函数中提供的路径不正确。这就是为什么我想知道如何根据给定的 XML.
给出正确的路径
那是因为您的 XML 具有默认命名空间:xmlns="urn:somethinghere"
。这个主题(XPath query against XML with default namespace)以前在 SO 中以各种形式被问过很多次。以下是我的回答历史中的一些内容:
- Use XPath with XML namespace
这是使用 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
您的问题是您的文档有一个默认命名空间,但 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 有点生疏,如果语法需要稍作调整,我们深表歉意,但希望您能理解。 "ns" 是任意的,您可以使用任何您想要的临时前缀。
感觉应该有办法让它识别默认命名空间,但出于某种原因,在它自己上添加文档命名表似乎无法识别它,但给它一个名字会起作用。
我有这个XML:
<?xml version="1.0"?>
<Document xmlns="urn:somethinghere">
<fapx.001.02>
<Sts>
<StsVal>ACCEPTED</StsVal>
</Sts>
</fapx.001.02>
</Document>
我想要 select "StsVal" 的值,为此我编写了这段代码但出现错误:
代码
Dim doc As XmlDocument = New XmlDocument()
doc.Load("myfile.xml")
Dim response As String = doc.SelectSingleNode("Document/fapx.001.02/Sts/StsVal").InnerText
错误
Object reference not set to an instance of an object.
编辑
我知道我收到此错误是由于 Null 值,可能是因为我在 SelectSingleNode 函数中提供的路径不正确。这就是为什么我想知道如何根据给定的 XML.
给出正确的路径那是因为您的 XML 具有默认命名空间:xmlns="urn:somethinghere"
。这个主题(XPath query against XML with default namespace)以前在 SO 中以各种形式被问过很多次。以下是我的回答历史中的一些内容:
- Use XPath with XML namespace
这是使用 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
您的问题是您的文档有一个默认命名空间,但 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 有点生疏,如果语法需要稍作调整,我们深表歉意,但希望您能理解。 "ns" 是任意的,您可以使用任何您想要的临时前缀。
感觉应该有办法让它识别默认命名空间,但出于某种原因,在它自己上添加文档命名表似乎无法识别它,但给它一个名字会起作用。