32.6. 表达式
结果类型
默认情况下,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>
请注意,如果
people
元素中有多个person
元素,则此基本模式可以匹配 多个 nodes iwl- iwl。/name/text()
-
如果您只想访问元素内部 的文本,请将
/text ()
附加到位置路径,否则节点会包括元素的 start 和 end 标签(当您将节点转换为字符串时,将包括这些标签)。 /person/telephone/@isDayTime
若要选择属性的值( AttributeName ),请使用语法
@AttributeName
。例如,当应用到以下 XML 片段时,前面的位置路径返回true
:<person> <telephone isDayTime="true">1234567890</telephone> </person>
*
-
匹配指定范围内所有元素的通配符。例如,
/people/person/\*
与人
的所有子元素匹配。 @*
-
匹配匹配元素的所有属性的通配符。例如:
/person/name/@\*
匹配每个匹配的name
元素的所有属性。 //
匹配每个嵌套级别的位置路径。例如,
//name
模式与以下 XML 片段中突出显示的每个name
元素匹配:<invoice> <person> <name .../> </person> </invoice> <person> <name .../> </person> <name .../>
..
- 选择当前上下文节点的父节点。通常不在 Apache Camel XPath 语言中有用,因为当前上下文节点是文档根(没有父项)。
node()
- 匹配任何类型的节点。
text()
- 匹配文本节点。
comment()
- 匹配注释节点。
processing-instruction()
- 匹配处理节点。
predicate 过滤器
您可以通过在方括号 [Predicate]
中附加 predicate 来过滤与位置路径匹配的一组节点。例如,您可以通过将 [ N]
附加到位置路径,从匹配项列表中选择Nth 节点。以下表达式选择第一个匹配的 person
元素:
/people/person[1]
以下表达式选择 second-last person
元素:
/people/person[last()-1]
您可以测试属性的值,以选择具有特定属性值的元素。以下表达式选择 name
元素,其 surname
属性可以是 Strachan 或 Davies:
/person/name[@surname="Strachan" or @surname="Davies"]
您可以使用任何组合 和
或
,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
子项
的上下文节点是路径 /invoice/
选择的 items 元素。items
子对象::
axis 将搜索限制为上下文节点 的子项,项目
,以便 child::item
与名为 item
的项目
的子项匹配。就事实而言,子::
axis 是默认的 axis,因此前面的示例可以像:
/invoice/items/item
但还有其他一些 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()]
前面的示例按顺序选择最后一个 person
元素(按文档顺序)。
有关 XPath 提供的所有功能的详情,请参考下面的参考。
参考
有关 XPath grammar 的完整详情,请查看 XML 路径语言、版本 1.0 规格。