.NET中的XPath SelectNodes

Gor*_*son 16 c# xml xpath

<Document>
  <A> 
    <B> 
      <C></C>
    </B>
  </A>
  <E>
   <F>
    <C></C>
   </F>
   <G>
    <C></C>
  </G>
 </E>
</Document>
Run Code Online (Sandbox Code Playgroud)

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

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

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

合理?

编辑:我怎么才能让它从那个节点开始返回?

Mar*_*ell 27

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

规格:

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


Jef*_*tes 11

指定.//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()/除非您在开始时指定一个节点.


slf*_*slf 6

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

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

/C 将只是根C节点

请参阅xpath语法参考