@XmlElementWrapper并不适合我

时间:2015-02-24 23:15:50

标签: xml jaxb

这是我的定义,它不会检索包装元素中的元素列表:

@XmlElementWrapper(name = "channels")
@XmlElement(name = "channel")
private ArrayList<Channel>  expChannels;

public ArrayList<Channel> getChannels() {
   return this.expChannels;
}

public void setChannels(ArrayList<Channel> listOfChannels) {
   this.expChannels = listOfChannels;
}

这是Channel模型对象的声明:

@XmlRootElement
public class Channel {

    //Channel() {}

    @XmlAttribute(name = "id")
    private Integer channelId;

    getters/setters

当我从xml获取数据时,会检索任何通道。

我已经尝试使用中级类频道,将代码更改为:

private Channels expChannels;

@XmlElement(name = "channels")
public Channels getChannels() {
    return this.expChannels;
}

public void setChannels(Channels listOfChannels) {
   this.expChannels = listOfChannels;
}

并定义频道:

@XmlRootElement(name="channels")
public class Channels {

    private List<Channel> expChannels = new ArrayList<Channel>();

    @XmlElement(name = "channel")

    getters/setters

这是XML文件的结构:

<experiment xmlns="experiment">
    <name>Test Experiment</name>
    <file>ExperimentTemplate.xml</file>
    <channels>  <!-- List of channel's -->
        <channel>
            <id>0</id>
            <name>Channel 1</name>
            <description>Channel 1 description</description>
        </channel>
        <channel>
            <id>1</id>
            <name>Channel 2</name>
            <description>Channel 1 description</description>
        </channel>
    </channels>
</experiment>

我可以避免使用Channels类吗?

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。在您的情况下,您需要将命名空间添加到XmlWrapper

@XmlElementWrapper(name = "channels", namespace = "experiment")
@XmlElement(name = "channel", namespace = "experiment")
private ArrayList<Channel>  expChannels;

我不明白为什么单独的@XmlElment注释不需要命名空间,但@XmlElementWrapper确实需要它,但就是这样。

它也适用于包级注释。这样,您只需要指定命名空间一次,并且整个包中的所有@XmlElementWrapper注释都可以工作:

@XmlSchema(namespace = "experiment", elementFormDefault = XmlNsForm.QUALIFIED, xmlns = { @XmlNs(prefix = "", namespaceURI = "experiment") })

答案 1 :(得分:0)

@XmlElementWrapper绝对有效。对于解组问题,最好填充对象模型并对其进行编组,并将结果与​​您要解组的XML进行比较。