.NET中的XPath SelectNodes

时间:2009-02-17 21:49:31

标签: c# xml xpath

<Document>
  <A> 
    <B> 
      <C></C>
    </B>
  </A>
  <E>
   <F>
    <C></C>
   </F>
   <G>
    <C></C>
  </G>
 </E>
</Document>

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

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

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

有意义吗?

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

4 个答案:

答案 0 :(得分:27)

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

来自spec

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

答案 1 :(得分:11)

指定.//C将达到您想要的效果,否则,XPath将从文档根目录而不是当前节点开始。

////的定义存在混淆,如下所示:

  

//简称   /后代或自身::节点()/。对于   例如,// para是缩写   /后裔或自身::节点()/ child :: para的   因此将选择任何para元素   该文件(甚至是一个para元素   是一个将被选中的文档元素   自文档元素以来// para   node是根节点的子节点);   div // para是缩写   DIV /后裔或自身::节点()/ child :: para的   所以将选择所有段落   div孩子的后代。

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

答案 2 :(得分:6)

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

/E//C将只是E

下的C节点

/C只是根C节点

请参阅xpath syntax reference

答案 3 :(得分:3)

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

  

// para选择所有段落   文档的后代和根   从而选择了所有的para元素   与上下文节点相同的文档

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

的事情
相关问题