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

请注意,如果 people 元素中有多个 person 元素,则此基本模式可以匹配 多个 nodes iwl- iwl。

/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 语言中有用,因为当前上下文节点是文档根(没有父项)。
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 表达式,您可以使用比较器 =, , !=, > , >= , & gt;= , & lt; , HBAC (在实践中,必须用 < entity 替换 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

子项 的上下文节点是路径 /invoice/ items 选择的 items 元素。子对象:: axis 将搜索限制为上下文节点 的子项,项目,以便 child::item 与名为 item 的项目 的子项匹配。就事实而言,子:: axis 是默认的 axis,因此前面的示例可以像:

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

但还有其他一些 axes (13),其中一些已以缩写形式看到 :@属性 的缩写: //descendant-or-self:: 的缩写。完整的 axes 列表如下(有关详细信息,请参阅以下参考):

  • ancestor
  • ancestor-or-self
  • attribute
  • 子级
  • descendant
  • descendant-or-self
  • following
  • following-sibling
  • namespace
  • parent
  • 前一页
  • preceding-sibling
  • self

Functions

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

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

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

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

参考

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat