获取单个节点的值产生“...无价值”
Get value of single node yields "... value of Nothing"
我有一个 XmlNode
对象 rowNode
,当我调用 rowNode.OuterXml
时,我得到了这个结果:
<Row Nr="1">
<Område FormulaR1C1="" />
<Position FormulaR1C1="" />
<Lev FormulaR1C1="" />
<Option FormulaR1C1="" />
</Row>
我正在尝试使用以下代码获取 Område
的值:
rowNode.SelectSingleNode("/Row/Område").InnerText
然后我得到 Referenced object has a value of 'Nothing'.
没关系,我想,因为它没有任何价值。但是后来我又转了 rowNode
对象,其中 XML 是:
<Row Nr="2">
<Område FormulaR1C1="1">1</Område>
<Position FormulaR1C1="1">1</Position>
<Lev FormulaR1C1="NM">NM</Lev>
<Option FormulaR1C1="" />
</Row>
我仍然得到 Referenced object has a value of 'Nothing'.
我也尝试了一些其他元素 - Lev
和 Position
但我得到了相同的 "Nothing" 结果。我做错了什么?
问题是由于默认命名空间的存在。访问命名空间中元素的一种可能方法是使用 XmlNamespaceManager
。您需要将前缀到命名空间 uri 的映射注册到命名空间管理器,然后在 xpath 中正确使用注册的前缀:
Dim doc As New XmlDocument()
.....
Dim nsManager As New XmlNamespaceManager(doc.NameTable)
nsManager.AddNamespace("d", "your-namespace-uri-here")
Dim result = rowNode.SelectSingleNode("/d:Row/d:Område", nsManager).InnerText
或者如果您在选择元素时不需要考虑命名空间,您可以使用 xpath local-name()
函数忽略它:
Dim result = rowNode.SelectSingleNode("/*[local-name()='Row']/*[local-name()='Område']").InnerText
我有一个 XmlNode
对象 rowNode
,当我调用 rowNode.OuterXml
时,我得到了这个结果:
<Row Nr="1">
<Område FormulaR1C1="" />
<Position FormulaR1C1="" />
<Lev FormulaR1C1="" />
<Option FormulaR1C1="" />
</Row>
我正在尝试使用以下代码获取 Område
的值:
rowNode.SelectSingleNode("/Row/Område").InnerText
然后我得到 Referenced object has a value of 'Nothing'.
没关系,我想,因为它没有任何价值。但是后来我又转了 rowNode
对象,其中 XML 是:
<Row Nr="2">
<Område FormulaR1C1="1">1</Område>
<Position FormulaR1C1="1">1</Position>
<Lev FormulaR1C1="NM">NM</Lev>
<Option FormulaR1C1="" />
</Row>
我仍然得到 Referenced object has a value of 'Nothing'.
我也尝试了一些其他元素 - Lev
和 Position
但我得到了相同的 "Nothing" 结果。我做错了什么?
问题是由于默认命名空间的存在。访问命名空间中元素的一种可能方法是使用 XmlNamespaceManager
。您需要将前缀到命名空间 uri 的映射注册到命名空间管理器,然后在 xpath 中正确使用注册的前缀:
Dim doc As New XmlDocument()
.....
Dim nsManager As New XmlNamespaceManager(doc.NameTable)
nsManager.AddNamespace("d", "your-namespace-uri-here")
Dim result = rowNode.SelectSingleNode("/d:Row/d:Område", nsManager).InnerText
或者如果您在选择元素时不需要考虑命名空间,您可以使用 xpath local-name()
函数忽略它:
Dim result = rowNode.SelectSingleNode("/*[local-name()='Row']/*[local-name()='Område']").InnerText