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");

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