简体   繁体   English

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

[英]How can I parse a list of nested XML objects in Java with JAXB?

I've parsed objects like the following, without any issues: 我已经解析了以下对象,没有任何问题:

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

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

with a class like this: 与这样的类:

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

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

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

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

}

This works fine, with my API calls I get a list of MyObjects as expected. 这很好用,通过我的API调用,我可以按预期获得MyObjects的列表。 but how do I handle this type of response: 但是我该如何处理这种类型的响应:

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

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

At first I thought building an ObjectWrapper class would do the trick, like this: 起初,我认为构建ObjectWrapper类可以解决问题,如下所示:

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

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

}

Then I thought about using @XmlElementWrapper too, but how? 然后我也考虑过使用@XmlElementWrapper ,但是如何? Can I just remove the @XmlRootElement from the class and ad @XmlElementWrapper on the list? 我可以只从类中删除@XmlRootElement从列表中删除广告@XmlElementWrapper吗?

Edit: No, I cannot remove the @XmlRootElement 编辑:不,我无法删除@XmlRootElement

You can simply write it like this: 您可以像这样简单地编写它:

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

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

}

You don't need an ObjectWrapper class. 您不需要ObjectWrapper类。

It doesn't matter if your class is named ObjectWrapper or not. 您的类是否命名为ObjectWrapper没有关系。 You need to specify correct wrapper name in @XmlElementWrapper which is objectWrapper . 您需要在@XmlElementWrapper指定正确的包装器名称,即objectWrapper

Your ObjectWrapper class should look like : 您的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;

    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM