2017-06-02 32 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類。