XML Tokenize
Since Camel 2.14
The XML Tokenize language (xtokenize) is a tokenizer specifically designed for XML documents. Unlike the conventional Tokenize language , which is primarily a text-based tokenizer, XML Tokenize uses a StAX parser to interpret the XML structure while producing tokens.
The conventional Tokenize language also provides an xml option for XML-aware tokenization (xml=true). This should not be confused with XML Tokenize: xtokenize uses different tokenization semantics and is intended for different use cases.
Use xtokenize when XML structure or namespaces are important, or when you want a tokenizer specifically designed for XML documents. Use the conventional Tokenize language when you primarily need text-based tokenization and XML awareness is sufficient for your use case.
Maven users will need to add the following dependency to their
pom.xml
for this language:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-stax</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
</dependency>
XML Tokenizer Options
The XML Tokenize language supports the following options which are listed below.
| Name | Default | Java Type | Description |
|---|---|---|---|
|
|
|
The extraction mode. The available extraction modes are: i - injecting the contextual namespace bindings into the extracted token (default), w - wrapping the extracted token in its ancestor context, u - unwrapping the extracted token to its child content, t - extracting the text content of the specified element. Enum values:
|
|
|
|
To group N parts together. |
||
|
|
Source to use, instead of message body. You can prefix with variable:, header:, or property: to specify kind of source. Otherwise, the source is assumed to be a variable. Use empty or null to use default source, which is the message body. |
||
|
|
The class of the result type (type from output). |
||
|
|
|
Whether to trim the source code to remove leading and trailing whitespaces and line breaks. |
Example
Suppose the input XML contains multiple orders:
<?xml version="1.0" encoding="UTF-8"?>
<orders xmlns="urn:shop">
<order>
<id>1001</id>
<customer>John</customer>
</order>
<order>
<id>1002</id>
<customer>Jane</customer>
</order>
</orders>
The XML Tokenize language can be used with the Split EIP to split the document
into one message for each
order
element.
-
Java
-
XML
-
YAML
var ns = new org.apache.camel.support.builder.Namespaces("shop", "urn:shop");
from("direct:start")
.split()
.xtokenize("//shop:order", 'i', ns)
.streaming()
.to("mock:order");
<route>
<from uri="direct:start"/>
<split streaming="true">
<xtokenize>//shop:order
<namespace key="shop" value="urn:shop"/>
</xtokenize>
<to uri="mock:order"/>
</split>
</route>
- route:
from:
uri: 'direct:start'
steps:
- split:
streaming: 'true'
expression:
xtokenize:
expression: '//shop:order'
namespace:
- key: shop
value: 'urn:shop'
steps:
- to:
uri: 'mock:order'
The Split EIP produces two messages. The body of the first message is:
<order xmlns="urn:shop">
<id>1001</id>
<customer>John</customer>
</order>
The body of the second message is:
<order xmlns="urn:shop">
<id>1002</id>
<customer>Jane</customer>
</order>
The
shop
namespace is mapped to
urn:shop
, allowing the XPath expression
//shop:order
to identify the namespaced
order
elements.
See the Split EIP for more examples.