JAXB使用Map而不是List,但获得XML输出,就像Map的值是List

时间:2018-07-01 10:19:21

标签: java xml jaxb

对于元素类型FoosFoo,我有一个xml模式:

<xs:complexType name="Foos">
    <xs:sequence>
        <xs:element name="foo" type="foo" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>

<xs:complexType name="Foo">
    <xs:attribute name="name" type="xs:string" use="optional" />
</xs:complexType>

然后为Foos生成的类(使用xjc,如此处所述:https://examples.javacodegeeks.com/core-java/xml/bind/jaxb-generate-classes-xsd/)看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foos", propOrder = {"foo"})
public class Foos {

    protected List<Foo> foo;

    public List<Foo> getFoo() {
        if (foo == null) {
            foo = new ArrayList<Foo>();
        }
        return this.foo;
    }
}

如果我创建名为Foos的{​​{1}}实例,则用两个myFoos填充它,并使用以下命令将其打印到控制台上

Foo

然后根据模式获得输出,如下所示:

jaxbContext = JAXBContext.newInstance(Foos.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(myFoos, System.out);

但是,为了更好地处理数据,我想使用<foos> <foo name="foo1"/> <foo name="foo2"/> </foos> 而不是Map<Foo, Foo>。但是我不希望XML输出发生变化:我只希望将地图的值写入XML; KEY根本不应该出现。

我该怎么做?

如果我这样更改班级List<Foo>

Foos

然后我将获得以下XML:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Foos", propOrder = {"foo"})
public class Foos {

    protected Map<Foo, Foo> foo;

    public Map<Foo, Foo> getFoo() {
        if (foo == null) {
            foo = new HashMap<Foo, Foo>();
        }
        return this.foo;
    }
}

1 个答案:

答案 0 :(得分:0)

信用归因于JB Nizet,使我指出正确的方向:

@XmlAccessorType(XmlAccessType.NONE)
@XmlType(name = "Foos", propOrder = { "foo" })
public class Foos {

    private Map<Foo, Foo> fooMap;

    @XmlElements(value = { @XmlElement })
    public Collection<Foo> getFoo() {
        return getFooMap().values();
    }

    public Map<Foo, Foo> getFooMap() {
        if (fooMap == null) {
            fooMap = new HashMap<Foo, Foo>();
        }
        return this.FooMap;
    }
}
  • 我将XmlAccessType更改为NONE是因为我们不再对字段感兴趣(而是对方法getFoo感兴趣)。
  • getFoo标记方法@XmlElements,以在xml序列化中使用它。
  • 无法通过使用XmlAccessType.PROPERTY使之工作;如果您是,请分享!