2009-02-17 53 views
15
<Document> 
    <A> 
    <B> 
     <C></C> 
    </B> 
    </A> 
    <E> 
    <F> 
    <C></C> 
    </F> 
    <G> 
    <C></C> 
    </G> 
</E> 
</Document> 

如果我使用XPath查询上述XML加载到一个XmlDocument,做的SelectSingleNode上的一个// C的XPath的SelectNodes

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

为什么它在B时的返回节点是什么我预计会发生只会返回节点从E

有意义吗?

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

回答

22

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

spec

  • // para选择文档根的所有的para子孙,因此选择相同的文件作为上下文节点中的所有para元素
  • .//para选择的对上下文节点的元素后代
11

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

的混乱是在从XPath standard所述的//定义如下:

//是短期的 /后代或自身::节点()/。对于 示例,// para是 /descendant-or-self :: node()/ child :: para 的简写,所以将选择 文档中的任何para元素(即使是 是文档元素的para元素将被选中为 by // para,因为文档元素 节点是根节点的子节点); div // para是 div/descendant-or-self :: node()/ child :: para 的简称,所以会选择所有的div子元素的子元素 。

因为///descendant-or-self::node()/的简称,它始于文档级别,除非您在开始时指定节点。

+0

不,规范说“//”是“文档根目录”,“.//”是上下文节点。实施是正确的。 – 2009-02-17 22:00:30

+0

重新W3学校ref:认真阅读:“在当前节点的文档中” - 上下文节点仅用于(仅)获取文档;然后扫描整个文档。 – 2009-02-17 22:01:27

6

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

/E//C将是下Ë是仅含有C节点

/C将只有根Ç节点

参见xpath syntax reference

3

XPATH Specification你会在2下找到。5以下声明:

// para选择所有文档根的对 后代和 从而选择 同一文档中的所有para元素作为上下文节点

即行为你观察是有效的。你应该做一些像“/ E // C”