JAXB在一个步骤中将Collection编组为XmlElement和XmlAttribute

时间:2010-01-30 17:00:46

标签: java xml jaxb

我想将Collection作为嵌套属性进行编组。

现在我有:

@XmlElement(name="entry")
public Collection<Integer> getSizes(){ ... }

返回:

<entry>1</entry>
<entry>2</entry>

但我想得到:

<entry id="1"/>
<entry id="2"/>

没有新课程,这可能吗?

2 个答案:

答案 0 :(得分:4)

如果没有新课程,似乎是不可能的。使用XmlAdapter

class EntryAdapter extends XmlAdapter<EntryAdapter.Entry, Integer>
{
    public EntryAdapter.Entry marshal(Integer id) {
        return new Entry(id);
    }

    public Integer unmarshal(Entry e) {
        return e.getId();
    }

    static class Entry 
    {
        private Integer id;

        public Entry() {}
        public Entry(Integer id) { this.id = id; }

        @XmlAttribute
        public Integer getId() { return id; }
        public void setId(Integer id) { this.id = id; }
    }
}

-

@XmlElement(name="entry")  
@XmlJavaTypeAdapter(EntryAdapter.class)
public Collection<Integer> getSizes(){ ... }

答案 1 :(得分:2)

正如接受的答案所说,XmlAdapter是标准的JAXB解决方案。

但是如果你使用EclipseLink MOXy作为你的JAXB提供者并且可以使用它的一个扩展,即@XmlPath,它可以用来实现相同的结果。

要将集合值编组为属性,可以像下面这样使用它:

@XmlPath("entry/@id")
public Collection<Integer> getSizes(){ ... }