【问题标题】:XPath SelectNodes in .NET.NET 中的 XPath 选择节点
【发布时间】:2009-02-17 21:49:30
【问题描述】:
<Document>
  <A> 
    <B> 
      <C></C>
    </B>
  </A>
  <E>
   <F>
    <C></C>
   </F>
   <G>
    <C></C>
  </G>
 </E>
</Document>

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

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

为什么它会从 B 下返回节点,而我期望它只从 E 下返回节点

有意义吗?

编辑:我如何让它只从该节点返回?

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

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

    来自spec

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

    【讨论】:

      【解决方案2】:

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

      混淆之处在于XPath standard// 的定义如下:

      // 是缩写 /后代或自我::节点()/。为了 例如,//para 是缩写 /descendant-or-self::node()/child::para 因此将选择任何 para 元素 文档(甚至是一个 para 元素 是一个文档元素将被选中 by //para 自文档元素 node 是根节点的子节点); div//para 的缩写 div/descendant-or-self::node()/child::para 因此将选择所有段落 div 孩子的后代。

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

      【讨论】:

      • 不,规范说“//”是“文档根目录”,“.//”是上下文节点。实现是正确的。
      • Re the W3 Schools ref: 仔细阅读:“in the document from the current node”——上下文节点用于(仅)获取文档;然后扫描整个文档。
      • 是的,我更新了它以引用 XPath 标准并突出显示混淆所在。谢谢。 :)
      【解决方案3】:

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

      /E//C 将只是 E 下的 C 节点

      /C 将只是根 C 节点

      xpath syntax reference

      【讨论】:

        【解决方案4】:

        XPATH Specification 中,您会在 2.5 下找到以下语句:

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

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

        【讨论】:

        • 如果我不知道深度 C 有多少节点怎么办?很可能是 /E/D/G/C ?
        • @Gordon - "/E//C" 可以处理 E 和 C 之间的任意数量的级别。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多