32.6. 表达式


结果类型

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

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

请注意,如果 people 元素 中的多个 person 元素中有多个 person 元素,则这个基本模式可以匹配多个节点 swig-wagon。

/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
*
与指定范围中的所有元素匹配的通配符。例如,/people/person/\* 匹配 个人 的所有子元素。
@*
匹配匹配元素的所有属性的通配符。例如,/person/name/@\* 匹配每个匹配 name 元素的所有属性。
//

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

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

predicate 过滤器

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

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

以下表达式选择 second-last person 元素:

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

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

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

您可以使用任何组合 ,not () 来组合 predicate 表达式,您可以使用 comparators, =, !=, > , > , &gt;= , & lt; , REPLACE (practice, less-than 符号)比较表达式。 您还可以在 predicate 过滤器中使用 XPath 功能。

Axes

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

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

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

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

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

但还有一些其他的 axes (全部有 13),其中的一些内容已以缩写形式显示 :@属性 的缩写: //descendant-or-self:: 的缩写。xes 的完整列表如下(有关以下参考信息):

  • ancestor
  • ancestor-or-self
  • attribute
  • 子对象
  • descendant
  • descendant-or-self
  • 关注
  • 以下同级
  • namespace
  • 之前
  • 半同级
  • Self

Functions

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

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

其中前面的示例以序列(按文档顺序)选择最后一个 person 元素。

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

参考

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat