第 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]}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.