我在使用Marshaller.JAXB_FRAGMENT属性成功编码时遇到了一些麻烦。这是我要输出的XML的简单版本。
<Import>
<WorkSets>
<WorkSet>
<Work>
<Work>
...
..
...
</WorkSet>
<WorkSet>
<Work>
<Work>
...
</WorkSet>
<WorkSets>
<Import>
<Import>
和<WorkSets>
元素实质上只是包含大量<WorkSet>
和<Work>
元素的容器元素。我目前正在尝试在<WorkSet>
中编码。<Import>
和<WorkSets>
元素,然后从此开始在<WorkSet>
元素中编码(marshal),并将输出包含在<Import><WorkSets>
标记中? xmlns='http://namespace.com'
属性附加到WorkSet标记中,有没有一种方法可以在没有将 namespace 属性附加到Workset的情况下进行编码(marshal)? 最佳答案
基本上,这听起来像不是要使用容器对象构造完整的对象树,而是希望能够流传输WorkSet实例的集合以使用JAXB编码(marshal)。
我将采用的方法是使用XMLStreamWriter并通过将WorkSet对象包装在JAXBElement中来编码(marshal)它们。我没有立即测试示例代码,因此以下是应使您步入编写轨道的粗略代码段:
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将拒绝编码(marshal)对象。