32.2. XML DSL


基本表达式

要评估 XML DSL 中的 XPath 表达式,请将 XPath 表达式放在 xpath 元素中。XPath 表达式应用于当前 In 消息的正文,并返回 XML 节点(或节点集)。通常,返回的 XML 节点会自动转换为字符串。

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

<beans ...>

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="queue:foo"/>
      <setHeader headerName="user">
        <xpath>/person/name/text()</xpath>
      </setHeader>
      <to uri="direct:tie"/>
    </route>
  </camelContext>

</beans>

如果要将结果转换为特定类型的类型,请通过将 resultType 属性设置为 Java 类型名称来指定结果类型(您必须指定完全限定类型名称)。例如,要明确指定结果类型是 java.lang.String (您可以省略此处的 java.lang. 前缀):

<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,您可以定义类似如下的路由:

<beans ...>

  <camelContext xmlns="http://camel.apache.org/schema/spring"
                xmlns:cust="http://acme.com/customer/record" >
    <route>
      <from uri="queue:foo"/>
      <setHeader headerName="user">
        <xpath>/cust:person/cust:name/text()</xpath>
      </setHeader>
      <to uri="direct:tie"/>
    </route>
  </camelContext>

</beans>

审计命名空间

使用 XPath 表达式时可能会出现的一个最频繁问题,即命名空间在传入消息和 XPath 表达式中使用的命名空间之间存在不匹配。为了帮助您对这类问题进行故障排除,XPath 语言支持通过选项将所有传入消息中的所有命名空间转储到系统日志中。

要在 INFO 日志级别启用命名空间日志记录,请在 XML DSL 中启用 logNamespaces 选项,如下所示:

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

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.