我在使用Marshaller.JAXB_FRAGMENT属性成功编组时遇到了一些麻烦。这是我想要输出的XML的简单版本。
<Import>
<WorkSets>
<WorkSet>
<Work>
<Work>
...
..
...
</WorkSet>
<WorkSet>
<Work>
<Work>
...
</WorkSet>
<WorkSets>
<Import>
<Import>
和<WorkSets>
元素基本上只是包含大量<WorkSet>
&amp;的容器元素。 <Work>
元素。我目前正试图在<WorkSet>
进行编组。
<Import>
和<WorkSets>
元素,然后再填充<WorkSet>
元素的封送,并将输出括在<Import><WorkSets>
标记中?xmlns='http://namespace.com'
属性附加到WorkSet标记,是否有一种方法可以在没有将名称空间属性附加到Workset的情况下进行编组?答案 0 :(得分:17)
基本上,它听起来不是用容器对象构造一个完整的对象树,而是希望能够使用JAXB将一组WorkSet实例流式化为marshal。
我将采用的方法是使用XMLStreamWriter并通过将它们包装在JAXBElement中来封送WorkSet对象。我手边没有经过测试的示例代码,所以这里是粗略的代码片段,可以让你在写入轨道上:
FileOutputStream fos = new FileOutputStream("foo.xml");
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fos);
writer.writeStartDocument();
writer.writeStartElement("Import");
writer.writeStartElement("WorkSets");
JAXBContext context = JAXBContext.newInstance(WorkSet.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
for (WorkSet instance : instances)
{
JAXBElement<WorkSet> element = new JAXBElement<WorkSet>(QName.valueOf("WorkSet"), WorkSet.class, instance);
m.marshal(element, writer);
}
writer.writeEndDocument(); // this will close any open tags
writer.close();
注意:以上内容完全未经测试,可能会在包装部分搞乱,以编写WorkSet的每个实例。您需要包装WorkSet实例,因为它们不会使用@XmlRootElement
进行注释,否则JAXB将拒绝封送对象。