328.5. JAXB 및 StAX를 사용하여 컬렉션을 반복합니다.
먼저 JAXB 개체가 있다고 가정합니다.
예를 들어 래퍼 오브젝트의 레코드 목록입니다.
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; } }
및
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; } }
그런 다음 처리할 XML 파일을 가져옵니다.
<?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>
StAX 구성 요소는 Camel Splitter로 XML 요소를 반복할 때 사용할 수 있는 StAXBuilder
를 제공합니다.
from("file:target/in") .split(stax(Record.class)).streaming() .to("mock:records");
여기서 stax
는 org.apache.camel.component.stax.StAXBuilder
의 정적 메서드이며 Java 코드에서 정적으로 가져올 수 있습니다. stax 빌더는 기본적으로 네임스페이스가 사용하는 XMLReader를 인식합니다. Camel 2.11.1 부터는 아래와 같이 부울 매개변수를 false로 설정하여 이 기능을 해제할 수 있습니다.
from("file:target/in") .split(stax(Record.class, false)).streaming() .to("mock:records");
328.5.1. XML DSL을 사용한 이전 예
위의 예는 XML DSL에서와 같이 구현될 수 있습니다.