73.3. 示例
from("queue:foo") .filter().xquery("//foo") .to("queue:bar")
您还可以使用查询中的功能,在这种情况下,您需要明确的类型转换,或者您将收到一个 org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR
。您需要传递函数的预期输出类型。例如,concat 函数返回一个 String
,它按如下方式完成:
from("direct:start") .recipientList().xquery("concat('mock:foo.', /person/@city)", String.class);
在 XML DSL 中:
<route> <from uri="direct:start"/> <recipientList> <xquery type="java.lang.String">concat('mock:foo.', /person/@city</xquery> </recipientList> </route>
73.3.1. 使用命名空间
如果您有一个标准的命名空间集,并且希望在多个 XQuery 表达式之间共享它们,您可以在使用 Java DSL 时使用 org.apache.camel.support.builder.Namespaces
,如下所示:
Namespaces ns = new Namespaces("c", "http://acme.com/cheese"); from("direct:start") .filter().xquery("/c:person[@name='James']", ns) .to("mock:result");
注意如何将命名空间提供给 xquery
以及作为第二参数传递的 ns
变量。
每个命名空间都是 key=value 对,前缀是键。在 XQuery 表达式中,命名空间被前缀使用,例如:
/c:person[@name='James']
命名空间构建器支持添加多个命名空间,如下所示:
Namespaces ns = new Namespaces("c", "http://acme.com/cheese") .add("w", "http://acme.com/wine") .add("b", "http://acme.com/beer");
在 XML DSL 中使用命名空间时,如您在 XML root 标签中设置命名空间(或 camelContext
, routes
, route
tag 之一)。
在下面的 XML 示例中,我们使用 Spring XML,其中在 root 标签 Bean
中声明命名空间,在 xmlns:foo="http://example.com/person"
一行中:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foo="http://example.com/person" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> <camelContext id="camel" xmlns="http://activemq.apache.org/camel/schema/spring"> <route> <from uri="activemq:MyQueue"/> <filter> <xquery>/foo:person[@name='James']</xquery> <to uri="mqseries:SomeOtherQueue"/> </filter> </route> </camelContext> </beans>
这个命名空间使用 foo
作为前缀,因此 <xquery>
表达式使用 /foo:
来使用这个命名空间。