32.2. XML DSL
基本表达式 复制链接链接已复制到粘贴板!
要评估 XML DSL 中的 XPath 表达式,请将 XPath 表达式放在 xpath
元素中。XPath 表达式应用于当前消息的正文,并返回 XML 节点(或节点集)。通常,返回的 XML 节点会自动转换为字符串。
例如,要从当前 In message body 中提取 /person/name
元素的内容,并使用它来设置名为 user
的标头,您可以定义如下路由:
如果要将结果转换为特定类型,通过将 resultType
属性设置为 Java 类型名称来指定结果类型(您必须指定完全限定类型名称)。例如,要明确指定结果类型是 java.lang.String
(您可以省略 java.lang.
前缀):
<xpath resultType="String">/person/name/text()</xpath>
<xpath resultType="String">/person/name/text()</xpath>
命名空间 复制链接链接已复制到粘贴板!
当其元素属于一个或多个 XML 模式的文档时,通常需要将命名空间 URI 与前缀相关联,以便您可以在 XPath 表达式中识别元素名称不清。可以使用标准 XML 机制将前缀与命名空间 URI 关联。也就是说,您可以设置如下属性: xmlns:Prefix="NamespaceURI"
.
例如,要将前缀 cust
与命名空间 http://acme.com/customer/record
关联,然后提取元素的内容 /cust:person/cust:name
,您可以定义一个类似如下的路由:
审核命名空间 复制链接链接已复制到粘贴板!
使用 XPath 表达式时,可能会出现的最频繁的问题是,命名空间在传入消息和 XPath 表达式中使用的命名空间之间不匹配。为了帮助您排除此类问题,XPath 语言支持了一个选项,将所有传入的信息都转储到系统日志中。
要在 INFO
日志级别中启用命名空间日志记录,请在 XML DSL 中启用 logNamespaces
选项,如下所示:
<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>
<xpath logNamespaces="true" resultType="String">/foo:person/@id</xpath>
或者,您可以将日志记录系统配置为在 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]}
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]}