2016-08-23 68 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; 
    } 
}