搜索

32.6. 表达式

download PDF

结果类型

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

xpath("/person/name/text()", String.class)

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

<xpath resultType="java.lang.String">/person/name/text()</xpath>

位置路径中的模式

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

/people/person

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

<people>
  <person>...</person>
</people>

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

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

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

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

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

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

predicate 过滤器

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

/people/person[1]

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

/people/person[last()-1]

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

/person/name[@surname="Strachan" or @surname="Davies"]

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

Axes

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

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

/invoice/items/child::item

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

/invoice/items/item

但还有其他一些的 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()]

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

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

参考

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.