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>_<-&gt;_& lt;。

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

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

<person>
  <telephone isDayTime="true">1234567890</telephone>
</person>
Copy to Clipboard Toggle word wrap
*
与指定范围中的所有元素匹配的通配符。例如,/body/person/\*个人 的所有子元素匹配。
@*
匹配匹配元素的所有属性的通配符。例如: /person/name/@\* 匹配每个匹配 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 节点。以下表达式选择第一个匹配的 person 元素:

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

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

/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() )组合 predicate 表达式,您可以使用比较器、= !=、>=、& gt;=、& lt;、表示( practice)替代 less-than 符号的表达式。 您还可以使用 predicate 过滤器中的 XPath 功能。

Axes

当您考虑 XML 文档的结构时,根元素包含一系列子项,其中一些子元素包含更多子项等。通过这种方式,嵌套元素的位置由子关系链接,整个 XML 文档具有 树结构现在,如果您选择此元素树中的特定节点(将其命名为 节点),您可能想引用与所选节点相关的树的不同部分。例如,您可能想要引用上下文节点的子项、上下文节点的父项,或与上下文节点共享相同父节点(同级节点)的所有节点上。

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

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

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

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

但是,还有其他一些的 axes(全部),您已被缩写为缩写形式的一些内容 :@属性 的缩写:而 // 是 descend -or-self:: 的缩写。如下为 axes 的完整列表(有关详细信息请参考下面的信息):

  • ancestor
  • 监管者
  • attribute
  • child
  • descendant
  • descendant-or-self
  • 关注
  • following-sibling
  • namespace
  • 前面的
  • 前面的同级
  • 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