重复不带xmlwrappers的xml元素序列集

时间:2018-01-31 00:18:29

标签: java xml jaxb

我正在尝试从Java类

创建Jaxb中的XML

具有如下XML结构:

<A>
    <b></b>
    <c></c>
    <d></d>
    <b></b>
    <c></c>
    <d></d>
    <b></b>
    <c></c>
    <d></d>
</A>

由于属性b,c,d的序列与XML包装器重复。以下是示例java代码:

@XmlRootElement(name = "A")
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
    B b;
    C c;
    D d;    

    ...(setters and getters)
        }

使用上面的java类,我可以生成以下XML: **

<A>
    <b></b>
    <c></c>
    <d></d>

</A>

但我是b,c,d的序列必须重复。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

您提供的xml将对应于如下所示的类:

@XmlRootElement(name="A")
@XmlAccessorType(XmlAccessType.FIELD)
public class A {

    @XmlElements({
            @XmlElement(name="b", type = String.class),
            @XmlElement(name="c", type = String.class),
            @XmlElement(name="d", type = String.class),
    })
    private List<String> letters;
}

更新以在评论中回复:

为了对列表的元素使用自定义类,我会做这样的事情:

我会创建一个接口Letter(在示例中没有详细说明):

public interface Letter { }

然后A类将是:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name= "A")
public class A {
    @XmlElements({
            @XmlElement(name="b", type = B.class),
            @XmlElement(name="c", type = C.class),
            @XmlElement(name="d", type = D.class),
    })
    List<Letter> letters;

    public A() {}

    public A(final List<Letter> letters) {
        this.letters = letters;
    }
}

和B,C,D将如下所示:

public class B implements Letter {
    @XmlValue
    String b;

    public B() {}

    public B(final String value) {
        this.b = value;
    }
}

要从POJO获取xml,这里有一个简单的主要用于演示目的:

public static void main(String[] args) {
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(A.class);
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            B b = new B("hello");
            C c = new C("hey");
            D d = new D("hi");
            List<Letter> letters = Arrays.asList(b,c,d);
            A a = new A(letters);

            marshaller.marshal(a, System.out);

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }