XMLNodeList 奇怪的行为

本文关键字:XMLNodeList | 更新日期: 2023-09-27 18:35:21

以下面的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 的第一次出现,但我觉得第一次出现应该是相对于节点本身的。即使从子节点中选择节点,该行为似乎也会从根目录找到第一个匹配项。这是微软打算工作的方式还是这是一个错误。

XMLNodeList 奇怪的行为

是的,谢谢,但只是删除斜杠就像在我的第二个示例中一样有效。

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

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

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

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

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

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

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

Microsoft正在实现 XPath 标准,是的,这就是 W3C 打算让 XPath 库工作的方式,这不是一个错误。