32.6. 表达式
结果类型 复制链接链接已复制到粘贴板!
默认情况下,XPath 表达式返回 org.w3c.dom.NodeList 类型的一个或多个 XML 节点列表。但是,您可以使用类型转换器机制将结果转换为不同的类型。在 Java DSL 中,您可以在 xpath () 命令的第二个参数中指定结果类型。例如,要将 XPath 表达式的结果作为字符串 返回 :
xpath("/person/name/text()", String.class)
xpath("/person/name/text()", String.class)
在 XML DSL 中,您可以在 resultType 属性中指定结果类型,如下所示:
<xpath resultType="java.lang.String">/person/name/text()</xpath>
<xpath resultType="java.lang.String">/person/name/text()</xpath>
位置路径中的模式 复制链接链接已复制到粘贴板!
您可以在 XPath 位置路径中使用以下模式:
/people/person基本位置路径指定特定元素的嵌套位置。也就是说,前面的位置路径与以下 XML 片段中的 person 元素匹配:
<people> <person>...</person> </people>
<people> <person>...</person> </people>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 请注意,如果
people元素 中的多个 person 元素中有多个person元素,则这个基本模式可以匹配多个节点 swig-wagon。/name/text()-
如果您只想访问元素内部 的文本,请将
/text ()附加到位置路径,否则节点包含元素的 start 和 end 标签(当您将节点转换为字符串时,会包含这些标签)。 /person/telephone/@isDayTime要选择属性的值 AttributeName,请使用语法
@AttributeName。例如,在应用到以下 XML 片段时,前面的位置路径返回true:<person> <telephone isDayTime="true">1234567890</telephone> </person>
<person> <telephone isDayTime="true">1234567890</telephone> </person>Copy to Clipboard Copied! Toggle word wrap Toggle overflow *-
与指定范围中的所有元素匹配的通配符。例如,
/people/person/\*匹配个人的所有子元素。 @*-
匹配匹配元素的所有属性的通配符。例如,
/person/name/@\*匹配每个匹配name元素的所有属性。 //匹配每个嵌套级别的位置路径。例如,
//name模式与以下 XML 片段中突出显示的每个name元素匹配:Copy to Clipboard Copied! Toggle word wrap Toggle overflow ..- 选择当前上下文节点的父节点。通常不适用于 Apache Camel XPath 语言,因为当前上下文节点是文档 root,没有父项。
node()- 匹配任何类型的节点。
text ()- 匹配文本节点。
comment ()- 匹配评论节点。
processing-instruction()- 匹配一个处理型节点。
predicate 过滤器 复制链接链接已复制到粘贴板!
您可以通过将 predicate 附加到方括号 [Predicate] 来过滤与位置路径匹配的节点集合。例如,您可以通过将 [ N] 附加到位置路径,从匹配项列表中选择Nth 节点。以下表达式选择第一个匹配的 person 元素:
/people/person[1]
/people/person[1]
以下表达式选择 second-last person 元素:
/people/person[last()-1]
/people/person[last()-1]
您可以测试属性值,以便选择具有特定属性值的元素。以下表达式选择 name 元素,其 surname 属性是 Strachan 或 Davies:
/person/name[@surname="Strachan" or @surname="Davies"]
/person/name[@surname="Strachan" or @surname="Davies"]
您可以使用任何组合 和 或,not () 来组合 predicate 表达式,您可以使用 comparators, =, !=, > , > , >= , & lt; , REPLACE (practice, less-than 符号)比较表达式。 您还可以在 predicate 过滤器中使用 XPath 功能。
Axes 复制链接链接已复制到粘贴板!
当您考虑 XML 文档的结构时,root 元素包含一系列子元素,其中一些子元素包含其他子元素等。以这种方式查看嵌套元素,其中嵌套元素由 子 关系链接在一起,整个 XML 文档包含 树 的结构。现在,如果您选择这个元素树中的特定节点( 称为上下文节点),您可能需要引用相对于所选节点树的不同部分。例如,您可能希望引用上下文节点的子项、上下文节点的子项,或指向与上下文节点共享相同的父节点(同级节点)的所有父节点。
XPath axis 用于指定节点匹配的范围,将搜索限制为节点树的特定部分,相对于当前上下文节点。axis 作为前缀附加到您要匹配的节点名称,语法为 AxisType::MatchingNode。例如,您可以使用 child:: axis 搜索当前上下文节点的子项,如下所示:
/invoice/items/child::item
/invoice/items/child::item
child::item 的上下文节点是路径 /invoice/ 选择的 items 元素。items child:: axis 将搜索限制为上下文节点 items 的子项,以便 child::item 与名为 item 的项目 的子项匹配。实际上,sub :: axis 是默认的 axis,因此前面的示例可以等效地写为:
/invoice/items/item
/invoice/items/item
但还有一些其他的 axes (全部有 13),其中的一些内容已以缩写形式显示 :@ 是 属性 的缩写: // 是 descendant-or-self:: 的缩写。xes 的完整列表如下(有关以下参考信息):
-
ancestor -
ancestor-or-self -
attribute -
子对象 -
descendant -
descendant-or-self -
关注 -
以下同级 -
namespace -
父 -
之前 -
半同级 -
Self
Functions 复制链接链接已复制到粘贴板!
XPath 提供了一组小的标准函数,这在评估 predicates 时很有用。例如,要从节点集合中选择最后一个匹配节点,您可以使用 last ()函数,该函数返回节点集合中最后一个节点的索引,如下所示:
/people/person[last()]
/people/person[last()]
其中前面的示例以序列(按文档顺序)选择最后一个 person 元素。
有关 XPath 提供的所有功能的详情,请参考下面的参考。
参考 复制链接链接已复制到粘贴板!
有关 XPath grammar 的完整详情,请参阅 XML 路径语言 Version 1.0 规格。