XMLNodeList奇怪的行为

时间:2016-02-18 22:37:26

标签: c# .net xml xpath xmlnodelist

以以下XML为例: <根>   <细纹和GT;     <线>       <数大于1< /数>     < /线>     <线>       <数大于2< /数>     < /线>   < /线> < /根> XmlNodeList nodeList = doc.SelectNodes(" // lines / line"); foreach(nodeList中的XmlNode节点) {     int index = node.SelectSingleNode(" // number"); } 对于两次迭代,上面的代码将导致index = 1。 foreach(nodeList中的XmlNode节点) {     int index = node.SelectSingleNode(" number"); } 上面的代码将分别产生1,2。我知道//找到第一次出现xpath,但我觉得第一次出现应该是相对于节点本身。即使从子节点选择节点,该行为似乎也会从根中找到第一个出现的行为。这是微软打算如何工作的方式或这是一个错误。

1 个答案:

答案 0 :(得分:2)

  

是的,谢谢,但只是删除斜线,以及我的第二个例子。

删除斜杠只能起作用,因为numberline的直接子元素。如果它在层次结构中更进一步:

<root>
  <lines>
    <line>
      <other>
        <number>1</number>
      </other>
    </line>
  </lines>
</root>

您仍然需要使用.//number

  

我认为如果你在一个节点内搜索//将返回整个文档的节点,我感到很困惑。

这就是XPath语法的设计方式。 XPath表达式开头的//表示评估上下文是文档节点 - XML文档的最外层节点。 .//表示路径表达式的上下文是当前上下文节点。

如果您仔细想想,在任何情境中都可以选择整个文档。

  

这是微软打算如何工作的方式,还是这个错误。

Microsoft正在实施XPath标准,是的,这就是W3C希望XPath库工作的方式,它不是一个bug。