.NET中的XPath SelectNodes

               

如果我将上述XML加载到XmlDocument并使用XPath查询在C上执行SelectSingleNode // C

 XmlNode oNode = oDocument.SelectSingleNode(“E”);
 XmlNodeList oNodeList = oNode.SelectNodes(“// C”);

为什么它会从Under B返回节点,而我预期会发生它只会从E下返回节点

合理?

编辑:我将如何使它只从该节点返回?

简单地说:前导//表示与所选节点在同一文档中的“任何级别”。

从规格 :

  • // para选择文档根的所有para后代,从而选择与上下文节点相同的文档中的所有para元素
  • .//para选择上下文节点的para元素后代

指定.//C将实现您想要的,否则,XPath从文档根而不是当前节点开始。

令人困惑的是来自XPath标准的//的定义如下:

//是/ descendant-or-self :: node()/的缩写。 例如,// para是/ descendant-or-self :: node()/ child :: para的缩写,因此将选择文档中的任何para元素(甚至作为文档元素的para元素将由/选择) / para,因为document element节点是根节点的子节点); div // para是div / descendant-or-self :: node()/ child :: para的缩写,因此将选择div children的所有para后代。

因为///descendant-or-self::node()/缩写,它在文档级别开始,除非您在开始时指定一个节点。

//C是整个文档中的所有C节点

/E//C只是E下的C节点

/C只是根C节点

请参阅xpath语法参考

在XPATH规范中,您将在2.5下找到以下声明:

// para选择文档根的所有para后代,从而选择与上下文节点相同的文档中的所有para元素

即你观察到的行为是有效的。 你应该做类似“/ E // C”的事情