JAXB碎片化编组

时间:2012-02-15 14:41:11

标签: java xml jaxb

我在使用Marshaller.JAXB_FRAGMENT属性成功编组时遇到了一些麻烦。这是我想要输出的XML的简单版本。

<Import>
    <WorkSets>
        <WorkSet>
            <Work>
            <Work>
            ...
            ..
            ...
        </WorkSet>
        <WorkSet>
            <Work>
            <Work>
            ...
        </WorkSet>
    <WorkSets>
<Import>

<Import><WorkSets>元素基本上只是包含大量<WorkSet>&amp;的容器元素。 <Work>元素。我目前正试图在<WorkSet>进行编组。

  1. 是否可以最初封送<Import><WorkSets>元素,然后再填充<WorkSet>元素的封送,并将输出括在<Import><WorkSets>标记中?
  2. 当我在WorkSet级别编组时,它将xmlns='http://namespace.com'属性附加到WorkSet标记,是否有一种方法可以在没有将名称空间属性附加到Workset的情况下进行编组?

1 个答案:

答案 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将拒绝封送对象。