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에서와 같이 구현될 수 있습니다.