.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”的事情