【问题标题】:What is the proper XPath for "all nodes exactly one below the base node?"“所有节点正好在基节点之下一个”的正确 XPath 是什么?
【发布时间】:2009-03-27 19:41:42
【问题描述】:

假设我不知道我的基节点或其子节点的名称,“所有节点正好在基节点之下一个”的 XPath 语法是什么?

模式是 XmlNode,我有以下代码:

XmlNodeList kvpsList = pattern.SelectNodes(@"//");

这对我来说看起来不错,但我得到以下异常:

   System.Xml.XPath.XPathException: Expression must evaluate to a node-set.

正确的语法是什么?

【问题讨论】:

  • 以后的读者请注意:对于“基节点”,Jekke 显然是指顶级元素(也称为“文档元素”或“最外层元素”)。 Jekke 的用法令人困惑,因为他确实不是 表示根节点(/),它是顶级元素的父节点。

标签: c# xml xpath


【解决方案1】:

你要找的路径是

/*/*

// 不是一个有意义的 XPath 表达式,因为它是一个运算符。如果您编写了类似//element 的内容,它将匹配XML 文档中任何位置的每个名为element 的元素,无论它在层次结构中有多深。

/*/* 表示“匹配层次结构中具有两个深度级别的每个节点”。

【讨论】:

  • 这个答案和@Jweede 混淆了“节点”和“元素”这两个术语。我怀疑@Jekke 也混淆了这些术语,所以这些答案就他的意思而言是正确的,但就他所说的而言却不是。 “节点”包括元素、属性、文本节点、根节点等。元素是用开始/结束标签表达的东西:<foo> </foo>。未指定轴的 XPath "" 仅匹配 *elements。有关更多信息,请参阅@Dimitre 的答案。
【解决方案2】:

目前的两个答案是错误的:

/*/*

不选择所有顶部节点的子节点。它不会选择作为顶部元素的子元素的任何文本节点、处理指令或 cmets。

选择作为顶部元素的子节点的所有节点的一个 XPath 表达式是:

/*/node()

// 不是语法正确的 XPath 表达式;根据XPath Spec:

// 是缩写 /descendant-or-self::node()/

请注意未完成定位步骤的开头在扩展缩写的最后。如果没有添加任何内容,则包含缩写的整个 XPath 表达式已完成,因此语法不正确。

另一个注意事项// 缩写在指定选择作为顶部元素的子节点的所有节点时不是必需的。如果您想选择 XML 文档中从顶部元素下降的所有节点,那么选择这些节点的一个 XPath 表达式是:

/*//node()

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2017-07-12
    • 2019-08-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    相关资源
    最近更新 更多