2016-08-23 70 views
0

我試圖將下面的XML轉換成JAXB帶註釋的類,但我無法想到元素在XML根內重複出現的解決方案。將XML轉換爲JAXB帶註釋的類

<addresses xmlns='http://jabber.org/protocol/address'> 
     <address type='to' jid='[email protected]/Work' /> 
     <address type='cc' jid='[email protected]/Home' /> 
    </addresses> 

我有這個類映射到XML,我想與屬性「類型」和「JID」元素「地址」,形成XML根元素列表中的每個項目的地址「內我傳入構造函數。

@XmlRootElement(name = "addresses", namespace = "http://jabber.org/protocol/address") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Addresses { 

    @XmlElement 
    private List<String> address; 

    private Addresses() { 
     // Private no-args default constructor for JAXB. 
    } 

    public Addresses(List<String> address) { 
     this.address = address; 
    } 
} 

例如,如果我通過列表(「用戶1」,「用戶2」,「用戶3」)實例化對象時,生成的XML將看起來像:

<addresses xmlns='http://jabber.org/protocol/address'> 
     <address type='to' jid='User1' /> 
     <address type='to' jid='User2' /> 
     <address type='to' jid='User3' /> 
    </addresses> 
+0

嘗試閱讀解決方案發布[這裏](http://stackoverflow.com/questions/24307106/how-to-annotate-a-list-using-xmlelement)。但似乎我不能使用@XmlElementWrapper註釋,因爲沒有辦法設置根元素的屬性(例如地址的名稱空間) – jeffsia

+1

」的子元素不是簡單的字符串值。它們是空的'

'具有兩個屬性的元素,所以你需要一個表示該對象的類,即具有兩個字段的對象:'type'和'jid'。然後將'List '替換爲'List
'。 – Andreas

+0

首先構建一個'xsd schema',然後使用maven插件'org.jvnet.jaxb2.maven2'或'xjc'來構建'JAXB'類。它更清楚地瞭解元素層次結構 – ulab

回答

0

我設法通過創建兩個類地址和地址來實現這一點。 地址根元素將獲取類「地址」列表作爲元素輸入。

@XmlRootElement(name = "addresses", namespace = "http://jabber.org/protocol/address") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Addresses { 

    @XmlElement 
    private List<Address> address; //List of type address 

    private Addresses() { 
     // Private no-args default constructor for JAXB. 
    } 

    public Addresses(List<String> address) { 
     this.address = address; 
    } 
} 

這是具有'to'和'jid'屬性的地址類。它在構造函數中接受一個類型爲String的輸入jid。

@XmlRootElement(name = "address") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Address { 

    @XmlAttribute 
    private String to = 'to'; 

    @XmlAttribute 
    private String jid; 

    private Address() { 
     // Private no-args default constructor for JAXB. 
    } 

    public Address(String jid) { 
     this.jid = jid; 
    } 
}