JAXB集合映射

时间:2016-06-28 18:15:55

标签: java xml jaxb

我是用Java处理XML的新手,但我使用的服务之一就是返回结果。到目前为止,我已经使用@XmlRootElement处理将XML映射到POJO - 就像注释一样。但现在我完全不知道这个文件:

<?xml version="1.0" encoding="windows-1251"?>
<response>
    <status>
        <code>0</code>
    </status>
    <result>
        <limit>2</limit>
        ...

        <data>
            <row0>
                <ID>85427</ID>
                <name>Default</name>
                <siteID>40628</siteID>
                 ... some elements
            </row0>
        </data>
    </result>
</response>

到目前为止,我使用这些类将XML(“数据”节点除外)绑定到POJO:

@XmlRootElement(name="response")
public class Response {

    private Status status;

    private String result;

    public Status getStatus() {
        return status;
    }

    @XmlElement(name = "status")
    public void setStatus(Status status) {
        this.status = status;
    }

    public String getResult() {
        return result;
    }

    @XmlElement(name ="result")
    public void setResult(String result) {
        this.result = result;
    }
}



@XmlRootElement(name = "status")
public class Status {

    private String ID;
    private String code;
    private String error;

    public String getID() {
        return ID;
    }

    @XmlElement(name = "ID")
    public void setID(String ID) {
        this.ID = ID;
    }

    public String getCode() {
        return code;
    }

    @XmlElement(name = "code")
    public void setCode(String code) {
        this.code = code;
    }

    public String getError() {
        return error;
    }

    @XmlElement(name = "error")
    public void setError(String error) {
        this.error = error;
    }
}

但是现在我需要将内容绑定为元素集合。我查找了示例,并且每个人都使用特定标记来定义集合项的根元素,但在本文档中,根标记将为<row0><row1>等。

我使用Jackson,如果我理解正确的话,使用JAXB注释来定义XML到POJO绑定规则。那么这笔交易是否可以通过这种方式解决,或者我必须以DOM风格操作这个文档?

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容解决问题:

创建代表您的<row0>,<row1>等的Row类,并像使用JAXB一样将其映射。

然后创建一个扩展XmlAdapter<List<Row>,List<Element>>的类,并定义marshall和unmarshall的摘要方法。

以下是一些帮助您的Javadoc:

XmlAdapter:http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

元素:http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Element.html

然后创建一个Data类:

public class Data{

    private List<Row> rows;

    public List<Row> getRows() {
        return rows;
    }

    @XmlAnyElement
    @XmlJavaTypeAdapter(MyRowsAdapter.class)
    public void setRows(List<Row> result) {
        this.rows = rows;
    }

}

然后,您可以将此映射添加到Response类:

private Data data;

public Data getData() {
    return data;
}

@XmlElement(name="data")
public void setData(Data data) {
    this.data = data;
}

请注意,要使此解决方案有效,您的<data>元素必须只包含您的行等元素。

此外,您不能使用@XmlElementWrapper而不是使用Data类,因为JAXB中的一个错误会导致不兼容的@XmlElementWrapper和@XmlJavaTypeAdapter:https://java.net/jira/browse/JAXB-787