Since we're on a major migration process of this website, some component documents here are out of sync right now. In the meantime you may want to look at the early version of the new website
https://camel.apache.org/staging/
We would very much like to receive any feedback on the new site, please join the discussion on the Camel user mailing list.
StAX ComponentAvailable as of Camel 2.9 The StAX component allows messages to be process through a SAX ContentHandler. Maven users will need to add the following dependency to their <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> URI formatstax:content-handler-class example: stax:org.superbiz.FooContentHandler From Camel 2.11.1 onwards you can lookup a stax:#myHandler Usage of a content handler as StAX parserThe message body after the handling is the handler itself. Here an example: from("file:target/in") .to("stax:org.superbiz.handler.CountingHandler") // CountingHandler implements org.xml.sax.ContentHandler or extends org.xml.sax.helpers.DefaultHandler .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { CountingHandler handler = exchange.getIn().getBody(CountingHandler.class); // do some great work with the handler } }); Iterate over a collection using JAXB and StAXFirst we suppose you have JAXB objects. For instance a list of records in a wrapper object: import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "records") public class Records { @XmlElement(required = true) protected List<Record> record; public List<Record> getRecord() { if (record == null) { record = new ArrayList<Record>(); } return record; } } and import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "record", propOrder = { "key", "value" }) public class Record { @XmlAttribute(required = true) protected String key; @XmlAttribute(required = true) protected String value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } Then you get a XML file to process: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <records> <record value="v0" key="0"/> <record value="v1" key="1"/> <record value="v2" key="2"/> <record value="v3" key="3"/> <record value="v4" key="4"/> <record value="v5" key="5"/> </record> The StAX component provides an from("file:target/in") .split(stax(Record.class)).streaming() .to("mock:records"); Where from("file:target/in") .split(stax(Record.class, false)).streaming() .to("mock:records"); The previous example with XML DSLThe example above could be implemented as follows in XML DSL Error rendering macro 'code': Invalid value specified for parameter 'java.lang.NullPointerException'<!-- use STaXBuilder to create the expression we want to use in the route below for splitting the XML file --> <!-- notice we use the factory-method to define the stax method, and to pass in the parameter as a constructor-arg --> <bean id="staxRecord" class="org.apache.camel.component.stax.StAXBuilder" factory-method="stax"> <!-- FQN class name of the POJO with the JAXB annotations --> <constructor-arg index="0" value="org.apache.camel.component.stax.model.Record"/> </bean> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <!-- pickup XML files --> <from uri="file:target/in"/> <split streaming="true"> <!-- split the file using StAX (ref to bean above) --> <!-- and use streaming mode in the splitter --> <ref>staxRecord</ref> <!-- and send each splitted to a mock endpoint, which will be a Record POJO instance --> <to uri="mock:records"/> </split> </route> </camelContext> |