...
Div | ||||||
---|---|---|---|---|---|---|
| ||||||
|
Examples
Code Block |
---|
from("queue:foo").filter().
xquery("//foo").
to("queue:bar")
|
You can also use functions inside your query, in which case you need an explicit type conversion (or you will get a org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR) by passing the Class as a second argument to the xquery() method.
Code Block |
---|
from("direct:start").
recipientList().xquery("concat('mock:foo.', /person/@city)", String.class);
|
...
If you prefer to configure your routes in your Spring XML file then you can use XPath expressions as follows
Code Block | ||
---|---|---|
| ||
<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>
|
...
When you use functions in your XQuery expression you need an explicit type conversion which is done in the xml configuration via the @type attribute:
Code Block | ||
---|---|---|
| ||
<xquery type="java.lang.String">concat('mock:foo.', /person/@city)</xquery> |
Using XQuery as transformation
We can do a message translation using transform or setBody in the route, as shown below:
Code Block |
---|
from("direct:start").
transform().xquery("/people/person"); |
Notice that xquery will use DOMResult by default, so if we want to grab the value of the person node, using text() we need to tell xquery to use String as result type, as shown:
Code Block |
---|
from("direct:start"). transform().xquery("/people/person/text()", String.class); |
Using XQuery as an endpoint
...
The following example shows how to take a message of an ActiveMQ queue (MyQueue) and transform it using XQuery and send it to MQSeries.
Code Block |
---|
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="activemq:MyQueue"/>
<to uri="xquery:com/acme/someTransform.xquery"/>
<to uri="mqseries:SomeOtherQueue"/>
</route>
</camelContext>
|
...
You can externalize the script and have Camel load it from a resource such as "classpath:"
, "file:"
, or "http:"
.
This is done using the following syntax: "resource:scheme:location"
, eg to refer to a file on the classpath you can do:
Code Block |
---|
.setHeader("myHeader").xquery("resource:classpath:myxquery.txt", String.class)
|
...
If you use maven you could just add the following to your pom.xml, substituting the version number for the latest & greatest release (see the download page for the latest versions).
Code Block |
---|
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-saxon</artifactId>
<version>x.x.x</version>
</dependency>
|