C# .NET中的XPath节点

C# .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>

如果我将上面的XML加载到一个XmlDocument中,并使用XPath查询在上执行SelectSingleNode//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");