C# .NET中的XPath节点
如果我将上面的XML加载到一个XmlDocument中,并使用XPath查询在上执行SelectSingleNode//CC# .NET中的XPath节点,c#,xml,xpath,C#,Xml,Xpath,如果我将上面的XML加载到一个XmlDocument中,并使用XPath查询在上执行SelectSingleNode//C <Document> <A> <B> <C></C> </B> </A> <E> <F> <C></C> </F> <G> <C>
<Document>
<A>
<B>
<C></C>
</B>
</A>
<E>
<F>
<C></C>
</F>
<G>
<C></C>
</G>
</E>
</Document>
XmlNode oNode=oDocument.SelectSingleNode(“E”);
XmlNodeList oNodeList=oNode.SelectNodes(“//C”);
为什么它会从B下返回节点,而我预期的情况是它只从E下返回节点
有道理吗
编辑:如何使其仅从该节点开始返回?简单地说:前导//在与所选节点相同的文档中表示“在任何级别” 从:
- //para选择文档根的所有para子体,从而选择作为上下文节点的同一文档中的所有para元素
- .//para选择上下文节点的para元素后代
//C
将实现您想要的,否则,XPath将从文档根而不是当前节点开始
以下是对/
的定义中的混淆:
//是的缩写
/后代或self::node()/。对于
例如,//para是
/后代或self::node()/child::para
因此,将在中选择任何para元素
该文档(甚至是一个para元素)
是否将选择一个文档元素
自document元素起按//para
节点是根节点的子节点);
div//para是的缩写
div/后代或self::node()/child::para
因此将选择所有段落
div儿童的后代
因为
//
是/genderant或self::node()//
的缩写,除非在开头指定一个节点,否则它从文档级别开始。/C
是整个文档中的所有C节点
/E//C
将仅是E下的C节点
/C
将只是根C节点
请参阅中的,您将在2.5中找到以下语句:
//para选择所有的para
文档根目录和
因此,选择
与上下文节点相同的文档
i、 e.你观察到的行为是有效的。您应该执行类似于“/E//C”否的操作,规范中说“//”是“文档根的”,而“/”是上下文节点的。实现是正确的。请重新阅读W3学校参考:仔细阅读:“来自当前节点的文档中”-上下文节点用于(仅)获取文档;然后扫描整个文档。是的,我更新了它以引用XPath标准,并突出显示了混淆的地方。谢谢。:)如果我不知道C有多少节点深呢?很可能是/E/D/G/C?@Gordon-“/E//C”将处理E和C之间的任何级别。 XmlNode oNode = oDocument.SelectSingleNode("E"); XmlNodeList oNodeList = oNode.SelectNodes("//C");