【问题标题】:JAXB Fragmented MarshallingJAXB 分段编组
【发布时间】:2012-02-15 14:41:10
【问题描述】:

我在使用 Marshaller.JAXB_FRAGMENT 属性成功编组时遇到了一些问题。这是我尝试输出的 XML 的简单版本。

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

&lt;Import&gt;&lt;WorkSets&gt; 元素本质上只是包含大量&lt;WorkSet&gt;&lt;Work&gt; 元素的容器元素。我目前正在尝试编组&lt;WorkSet&gt;

  1. 是否可以先编组&lt;Import&gt;&lt;WorkSets&gt; 元素,然后再编组&lt;WorkSet&gt; 元素并将输出包含在&lt;Import&gt;&lt;WorkSets&gt; 标记中?
  2. 当我在 WorkSet 级别编组时,它会将 xmlns='http://namespace.com' 属性附加到 WorkSet 标记,有没有办法在不将命名空间属性附加到 Workset 的情况下进行编组?

【问题讨论】:

  • 我不确定我是否理解你。什么是“和元素”?我只看到 WorkSet、WorkSets 和 Import。当你说“......最初编组和元素,然后从那时起编组元素......”时,你是什么意思?
  • @AlexR 当我第一次发布问题时,它没有显示问题中的标签,我对其进行了编辑,因此它们现在应该显示,如果没有,请告诉我。
  • 如果您接受了这篇文章中的答案,为什么还要将问题复制为JAXB Fragment Marshal w/o namespace?至少提到这个问题是分叉的......

标签: java xml jaxb


【解决方案1】:

基本上,您希望能够使用 JAXB 将 WorkSet 实例的集合流式传输到编组,而不是使用容器对象构建完整的对象树。

我将采用的方法是使用 XMLStreamWriter 并通过将 WorkSet 对象包装在 JAXBElement 中来编组它们。我没有测试手头的示例代码,所以这里是粗略的代码 sn-p 应该让你进入写入轨道:

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 将拒绝编组对象。

【讨论】:

  • 谢谢@JörnHorstmann,我忘记了片段部分,只是回来自己添加。
  • 谢谢!我只是试了一下,它似乎运作良好。我添加了第二个问题,当编组 WorkSet 实例时,由于某种原因,xmlns 属性被附加到每个 WorkSet 元素,有没有办法在编组时不分配此属性?
  • 那个,我完全不确定。我想我会开始仔细阅读 JAXB javadocs。对不起!
  • @TyC 关于 xmlns 属性的最后一个问题你有什么答案吗?
  • @Dion_E 是的,它实际上是在另一个线程中回答的 - stackoverflow.com/questions/9297872/…
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多