2017-06-02 170 views
0

我喜欢解析下面的对象,没有任何问题:如何使用JAXB解析Java中的嵌套XML对象列表?

<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

+0

不'ObjectWrapper'工作中的解决方案?在'ObjectWrapper'和'MyObject'中都有'@ XmlRootElement'没有问题。 – Berger

回答

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; 

    } 
} 
1

你可以简单地把它写这样的:

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

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

} 

你并不需要一个ObjectWrapper类。