328.5. 使用 JAXB 和 StAX 迭代集合

首先,我们假设您具有 JAXB 对象。

例如,在 wrapper 对象中记录列表:

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 组件提供了一个 StAXBuilder,可在使用 Camel Splitter 迭代 XML 元素时使用

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 中实施