<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下的节点
有意义吗?
编辑:我怎么才能让它从那个节点开始返回?
答案 0 :(得分:27)
简单地说:一个前导//表示与所选节点在同一文档中的“任何级别”。
来自spec:
答案 1 :(得分:11)
指定.//C
将达到您想要的效果,否则,XPath将从文档根目录而不是当前节点开始。
//
中//
的定义存在混淆,如下所示:
//简称 /后代或自身::节点()/。对于 例如,// para是缩写 /后裔或自身::节点()/ child :: para的 因此将选择任何para元素 该文件(甚至是一个para元素 是一个将被选中的文档元素 自文档元素以来// para node是根节点的子节点); div // para是缩写 DIV /后裔或自身::节点()/ child :: para的 所以将选择所有段落 div孩子的后代。
因为/descendant-or-self::node()/
是{{1}}的缩写,所以它从文档级别开始,除非您在开始时指定一个节点。
答案 2 :(得分:6)
答案 3 :(得分:3)
在XPATH Specification中,您将在2.5下找到以下声明:
// para选择所有段落 文档的后代和根 从而选择了所有的para元素 与上下文节点相同的文档
即。你观察到的行为是有效的。你应该做类似“/ E // C”
的事情