【问题标题】:XPath and Selecting a single nodeXPath 和选择单个节点
【发布时间】:2008-08-25 20:32:36
【问题描述】:

我在 .NET 中使用 XPath 来解析 XML 文档,如下所示:

XmlNodeList lotsOStuff = doc.SelectNodes("//stuff");

foreach (XmlNode stuff in lotsOStuff) {
   XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild");
   // ... etc
}

问题是stuffChild 的XPath 查询总是返回第一个stuff 元素的子元素,而不是其余元素。 XPath 不能用于查询个人XMLElement吗?

【问题讨论】:

    标签: .net xpath


    【解决方案1】:

    // 在 XPath 表达式的开头从文档根开始。试试“.//stuffChild”。 .是 self::node() 的简写,它将设置搜索的上下文, // 是后代轴的简写。

    所以你有:

    XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");
    

    翻译为:

    xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");

    xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");
    

    在子节点可能与父节点同名的情况下,您可能希望使用下面稍微详细一点的语法,以确保您不会重新选择父节点:

    xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");
    

    还要注意,如果“stuffChild”是“stuff”的直系后代,您可以完全省略前缀,而只选择“stuffChild”。

    XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
    

    W3Schools 教程以易于理解的格式提供有用的信息。

    【讨论】:

    • .//foo 等于 descendant::foo 并且通常是错误选择后代节点的方式。见stackoverflow.com/questions/453191
    • 也许你错过了 .,它设置了以下 XPath 的上下文?
    • 请参阅文档以了解 // 缩写。 .//foo 转换为 self::node()/descendant-or-self::node()/child::stuffChild
    • 你是对的 - 更新答案。请注意,.// 适用于提问者的情况(子节点的名称与上下文节点不同)。
    【解决方案2】:

    您在stuffChild 前面使用的// 表示您正在寻找stuffChild 元素,从根开始。

    如果要从当前节点(当前节点的后代)开始,应该使用.//,如:

    stuff.SelectSingleNode(".//stuffChild");
    

    【讨论】:

      【解决方案3】:

      如果“stuffChild”是“stuff”的子节点,那么您的 xpath 应该是:

      XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
      

      【讨论】:

        【解决方案4】:

        选择单个节点意味着您只需要第一个元素。所以,最好的解决方案是:

        XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-02
          • 2011-10-11
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多