JAXB碎片化编组

TyC*_*TyC 7 java xml jaxb

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

<Import>
    <WorkSets>
        <WorkSet>
            <Work>
            <Work>
            ...
            ..
            ...
        </WorkSet>
        <WorkSet>
            <Work>
            <Work>
            ...
        </WorkSet>
    <WorkSets>
<Import>
Run Code Online (Sandbox Code Playgroud)

<Import><WorkSets>元件基本上围住了大量的只是容器元素<WorkSet>&<Work>元件.我现在正试图在马萨诸塞州<WorkSet>.

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

Oph*_*ian 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();
Run Code Online (Sandbox Code Playgroud)

注意:以上内容是完全未经测试的,可能会在包装部分中弄乱一些东西来编写WorkSet的每个实例.您需要包装WorkSet实例,因为它们不会被注释,@XmlRootElement否则JAXB将拒绝封送对象.