如何使用JAXB解析Java中的嵌套XML对象列表?

时间:2017-06-02 13:24:17

标签: java xml jaxb

我已经解析了以下对象,没有任何问题:

<response>
    <myObject>
        <id>1</id>
        <name>abc</name>
    </myObject>

    <myObject>
        <id>2</id>
        <name>def</name>
    </myObject>
</response>

这样的课程:

@XmlRootElement(name="myObject")
public class MyObject{

    @XmlElement(name="id")
    long id;

    @XmlElement(name="name")
    String name;

    /* getters and setters ... etc.. */

}

这很好用,通过我的API调用,我得到了MyObjects的预期列表。 但是如何处理这种类型的响应:

<response>
    <objectWrapper>
        <myObject>
            <id>1</id>
            <name>abc</name>
        </myObject>

        <myObject>
            <id>2</id>
            <name>def</name>
        </myObject>
    </objectWrapper>
</response>

起初我认为构建一个ObjectWrapper类可以解决这个问题:

@XmlRootElement(name="objectWrapper")
public class ObjectWrapper{

    @XmlElement(name="myObject")
    List<MyObject> myObject;
    /* getters and setters ... etc.. */

}

然后我考虑过使用@XmlElementWrapper,但是怎么样? 我可以从课程中删除@XmlRootElement和列表中的广告@XmlElementWrapper吗?

编辑:不,我无法移除@XmlRootElement

2 个答案:

答案 0 :(得分:1)

您可以这样写:

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

    @XmlElementWrapper(name="objectWrapper")
    @XmlElement(name="myObject")
    List<MyObject> myObject;
    /* getters and setters ... etc.. */

}

您不需要ObjectWrapper课程。

答案 1 :(得分:1)

如果您的班级名为ObjectWrapper,则无关紧要。 您需要在@XmlElementWrapper objectWrapper中指定正确的包装器名称。

您的ObjectWrapper课程应如下所示:

@XmlRootElement( name = "response" )
@XmlAccessorType( XmlAccessType.FIELD )
public class ObjectWrapper
{
    @XmlElementWrapper( name = "objectWrapper" )
    @XmlElement( name = "myObject" )
    private List<MyObject> myObjects;


    public void setMyObjects( List<MyObject> objects )
    {
        this.myObjects  = objects;
    }

    public List<MyObject> getMyObjects()
    {
        return myObjects;

    }
}