获取单个节点的值产生“...无价值”

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'. 我也尝试了一些其他元素 - LevPosition 但我得到了相同的 "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