XMLNodeList 奇怪的行为

XMLNodeList Weird Behavior

以下XML为例:

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

XmlNodeList nodeList = doc.SelectNodes("//lines/line");
foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("//number");
}

以上代码将导致两次迭代的索引 = 1。

foreach(XmlNode node in nodeList)
{
    int index = node.SelectSingleNode("number");
}

以上代码将分别得到 1,2。我知道 // 找到 xpath 的第一次出现,但我觉得第一次出现应该是相对于节点本身的。即使从子节点中选择节点时,该行为似乎也是从根中找到第一次出现的。这是微软希望它工作的方式还是这是一个错误。

yeah thanks but just removing the slashes worked as well as in my second example.

删除斜线只有效,因为 numberline 的直接子元素。如果它在层次结构中更靠下:

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

您仍然需要使用 .//number

I just think it is confusing that if you are searching for node within a node that // would go back to the whole document.

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

如果你仔细想想,有一种方法可以在任何上下文中从整个文档中 select 实际上是有用的。

Is this the way microsoft intended this to work or is this a bug.

Microsoft 正在实施 XPath 标准,是的,这就是 W3C 希望 XPath 库工作的方式,这不是错误。