对于元素类型Foos
和Foo
,我有一个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;
}
}
答案 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
使之工作;如果您是,请分享!