第 32 章 XPath 语言


摘要

在处理 XML 消息时,XPath 语言允许您通过指定对消息的 Document Object Model (DOM)操作的 XPath 表达式来选择消息的一部分。您还可以定义 XPath predicates 来测试元素或属性的内容。

32.1. Java DSL

基本表达式

您可以使用 xpath ("Expression") 来评估当前交换上的 XPath 表达式(其中 XPath 表达式应用到当前 In 消息的正文)。xpath () 表达式的结果是一个 XML 节点(如果有多个节点匹配,则为节点设置)。

例如,要从当前消息正文中提取 /person/name 元素的内容,并使用它来设置名为 user 的标头,您可以定义一个类似如下的路由:

from("queue:foo")
    .setHeader("user", xpath("/person/name/text()"))
    .to("direct:tie");

您可以使用 fluent builder xpath () 命令来将 xpath ()指定为 setHeader () 的参数,而是使用 fluent builder xpath () 命令,例如:

from("queue:foo")
    .setHeader("user").xpath("/person/name/text()")
    .to("direct:tie");

如果要将结果转换为特定类型的,请将结果类型指定为 xpath () 的第二个参数。例如,指定结果类型是 String

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

命名空间

通常,XML 元素属于由命名空间 URI 标识的模式。当处理文档时,需要把命名空间 URI 与前缀关联,以便您可以在 XPath 表达式中不清地识别元素名称。Apache Camel 提供帮助程序类 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.