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

<Import>
    <WorkSets>
        <WorkSet>
            <Work>
            <Work>
            ...
            ..
            ...
        </WorkSet>
        <WorkSet>
            <Work>
            <Work>
            ...
        </WorkSet>
    <WorkSets>
<Import>
<Import><WorkSets>元素实质上只是包含大量<WorkSet><Work>元素的容器元素。我目前正在尝试在<WorkSet>中编码。
  • 是否可以首先编码(marshal)<Import><WorkSets>元素,然后从此开始在<WorkSet>元素中编码(marshal),并将输出包含在<Import><WorkSets>标记中?
  • 当我在WorkSet级别进行编码(marshal)处理时,它将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)对象。

    09-26 15:03