0

以下面的 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");
}

上面的代码将导致两次迭代的 index = 1。

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

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

4

1 回答 1

2

是的,谢谢,但只是删除斜线和我的第二个例子一样有效。

删除斜线仅有效,因为number它是 . 的直接子元素line。如果它在层次结构中更靠后:

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

你仍然需要使用.//number.

我只是认为,如果您在一个节点中搜索节点,那么 // 会返回到整个文档,这很令人困惑。

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

如果您考虑一下,实际上有一种方法可以在任何上下文中从整个文档中进行选择。

这是微软希望它工作的方式还是这是一个错误。

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

于 2016-02-19T07:48:31.933 回答