第 32 章 XPath 语言
摘要
在处理 XML 消息时,XPath 语言可让您选择消息的一部分,方法是指定 XPath 表达式,该表达式对消息的 Document Object Model (DOM)起作用。您还可以定义 XPath predicates 来测试元素或属性的内容。
32.1. Java DSL
基本表达式
您可以使用 xpath ("Expression")
来评估当前交换的 XPath 表达式(其中 XPath 表达式被应用于当前消息的正文)。xpath ()
表达式的结果是一个 XML 节点(如果有多个节点匹配,则为节点集)。
例如,要从当前 In message body 中提取 /person/name
元素的内容,并使用它来设置名为 user
的标头,您可以定义如下路由:
from("queue:foo") .setHeader("user", xpath("/person/name/text()")) .to("direct:tie");
您可以使用 fluent builder xpath ()
命令将 xpath ()指定为 setHeader ()
的参数,而不是将 xpath ()
指定为 setHeader ()的参数:
from("queue:foo") .setHeader("user").xpath("/person/name/text()") .to("direct:tie");
如果要将结果转换为特定的类型,请将结果类型指定为 xpath ()
的第二个参数。例如,要明确指定结果类型为 String
:
xpath("/person/name/text()", String.class)
命名空间
通常,XML 元素属于一个 schema,它由命名空间 URI 标识。当处理文档时,需要将命名空间 URI 与前缀关联,以便您可以在 XPath 表达式中识别元素名称。Apache Camel 提供 helper 类 org.apache.camel.builder.xml.Namespaces
,用于定义命名空间和前缀之间的关联。
例如,要将前缀 cust
与命名空间 http://acme.com/customer/record
关联,然后提取元素的内容 /cust:person/cust:name
,您可以定义一个类似如下的路由:
import org.apache.camel.builder.xml.Namespaces;
...
Namespaces ns = new Namespaces("cust", "http://acme.com/customer/record");
from("queue:foo")
.setHeader("user", xpath("/cust:person/cust:name/text()", ns))
.to("direct:tie");
如果您通过将 Namespaces
对象 ns
作为额外参数,使命名空间定义可用于 xpath ()
表达式构建器。如果您需要定义多个命名空间,请使用 Namespace.add ()
方法,如下所示:
import org.apache.camel.builder.xml.Namespaces; ... Namespaces ns = new Namespaces("cust", "http://acme.com/customer/record"); ns.add("inv", "http://acme.com/invoice"); ns.add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
如果您需要指定结果 类型和 定义命名空间,可以使用 xpath ()
的三参数形式,如下所示:
xpath("/person/name/text()", String.class, ns)
审核命名空间
使用 XPath 表达式时,可能会出现的最频繁的问题是,命名空间在传入消息和 XPath 表达式中使用的命名空间之间不匹配。为了帮助您排除此类问题,XPath 语言支持了一个选项,将所有传入的信息都转储到系统日志中。
要在 INFO
日志级别中启用命名空间日志记录,请在 Java DSL 中启用 logNamespaces
选项,如下所示:
xpath("/foo:person/@id", String.class).logNamespaces()
或者,您可以将日志记录系统配置为在 org.apache.camel.builder.xml.XPathBuilder
日志记录器上启用 TRACE
级别日志记录。
启用命名空间日志记录后,您将看到每条处理的消息中的日志消息:
2012-01-16 13:23:45,878 [stSaxonWithFlag] INFO XPathBuilder - Namespaces discovered in message: {xmlns:a=[http://apache.org/camel], DEFAULT=[http://apache.org/default], xmlns:b=[http://apache.org/camelA, http://apache.org/camelB]}