32.6. 表达式


结果类型

默认情况下,XPath 表达式会返回一个或多个 XML 节点列表,其中包括 org.w3c.dom.NodeList 类型。但是,您可以使用类型转换器机制将结果转换为不同的类型。在 Java DSL 中,您可以在 xpath () 命令的第二个参数中指定结果类型。例如,要将 XPath 表达式的结果返回为 String

xpath("/person/name/text()", String.class)
Copy to Clipboard Toggle word wrap

在 XML DSL 中,您可以在 resultType 属性中指定结果类型,如下所示:

<xpath resultType="java.lang.String">/person/name/text()</xpath>
Copy to Clipboard Toggle word wrap

位置路径中的模式

您可以在 XPath 路径中使用以下模式:

/people/person

基本位置路径指定特定元素的嵌套位置。也就是说,前面的位置路径将与以下 XML 片段中的 person 元素匹配:

<people>
  <person>...</person>
</people>
Copy to Clipboard Toggle word wrap

请注意,这种基本模式可以匹配 多个 nodes-2021-33-cgi,例如,如果 人们 元素中有多个 元素,则这个模式可以匹配。

/name/text()
如果您只想访问这个元素中的文本,请将 / text () 附加到位置路径,否则节点会包含元素的 start 和 end 标签(当您将节点转换为字符串时包括这些标签)。
/person/telephone/@isDayTime

若要选择属性值,AttributeName,可使用语法 @AttributeName。例如,当应用于以下 XML 片段时,前面的位置路径会返回 true

<person>
  <telephone isDayTime="true">1234567890</telephone>
</person>
Copy to Clipboard Toggle word wrap
*
与指定范围中的所有元素匹配的通配符。例如,/人员/人/\* 匹配 的所有子元素。
@*
匹配匹配匹配元素的所有属性的通配符。例如,/person/name/@\* 匹配每个匹配 名称 元素的所有属性。
//

匹配每个嵌套级别的位置路径。例如,//name 模式与以下 XML 片段中突出显示的每个 名称 元素匹配:

<invoice>
  <person>
    <name .../>
  </person>
</invoice>
<person>
  <name .../>
</person>
<name .../>
Copy to Clipboard Toggle word wrap
..
选择当前上下文节点的父项。不适用于 Apache Camel XPath 语言,因为当前上下文节点是文档根目录,因此没有父项。
node()
匹配任何类型的节点。
text()
匹配文本节点。
comment()
匹配注释节点。
processing-instruction()
匹配处理节点。

predicate 过滤器

您可以通过在方括号中附加 predicate [Predicate] 来过滤与位置路径匹配的节点集合。例如,您可以通过将 [ N] 附加到位置路径,从匹配列表中选择Nth 节点。以下表达式选择第一个匹配 的用户角色

/people/person[1]
Copy to Clipboard Toggle word wrap

以下表达式选择第二最后的用户角色 元素

/people/person[last()-1]
Copy to Clipboard Toggle word wrap

您可以测试属性值,以便选择带有特定属性值的元素。以下表达式选择 名称 元素,其 surname 属性是 Strachan 或 Davies:

/person/name[@surname="Strachan" or @surname="Davies"]
Copy to Clipboard Toggle word wrap

您可以使用任何组合、not () 匹配谓词表达式,您可以使用比较器( =, !=, >= , > , & gt;= , & lt; , tc (在 practice, less-than 符号)进行比较。 您还可以使用 predicate 过滤器中的 XPath 功能。

Axes

当您考虑 XML 文档的结构时,root 元素包含一系列子项,其中部分子元素包含其他子项等等。查看这种方法时,嵌套元素通过 关系链接在一起,整个 XML 文档包含 树结构。现在,如果您在这个元素树中选择一个特定节点(记住它 的上下文节点),您可能要引用相对于所选节点的不同树部分。例如,您可能想要引用上下文节点的子项、上下文节点的父项,或者指向与上下文节点共享相同父节点(同级节点)的所有节点。

XPath axis 用于指定节点匹配范围,将搜索限制为节点树的特定部分(相对于当前上下文节点)。axis 作为您要匹配的节点名称的前缀作为前缀,使用语法 AxisType::MatchingNode。例如,您可以使用 sub :: axis 搜索当前上下文节点的子项,如下所示:

/invoice/items/child::item
Copy to Clipboard Toggle word wrap

child::item 的上下文节点是路径 /invoice/ items 选择的 items 元素。sub:: axis 将搜索范围限制为上下文节点的子项,这样 子::item 与名为 item 的项目 的子项匹配。事实上,sub :: axis 是默认的 axis,因此前面的示例可以等同作:

/invoice/items/item
Copy to Clipboard Toggle word wrap

但还有其他一些的 axes (全部),其中的一些形式已经以简写形式看到 :@属性 的缩写: //descendant-or-self:: 的缩写。下面是一个xes 的完整列表(详情请参阅以下参考):

  • ancestor
  • ancestor-or-self
  • attribute
  • child
  • descendant
  • descendant-or-self
  • 关注
  • following-sibling
  • namespace
  • parent
  • 前面的
  • preceding-sibling
  • self

Functions

XPath 提供了一组小型标准功能,在评估 predicates 时很有用。例如,若要从节点集合中选择最后的匹配节点,您可以使用 last ()函数,该函数返回节点集中的最后一个节点的索引,如下所示:

/people/person[last()]
Copy to Clipboard Toggle word wrap

在前面的示例中,选择序列中的最后一个人数(按文档顺序)。

有关 XPath 提供的所有功能的详情,请参考下面的参考。

参考

有关 XPath grammar 的完整详情,请查看 XML 路径语言 Version 1.0 规格。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat