【问题标题】:Java JAXB - Writing XML files with restart logicJava JAXB - 使用重启逻辑编写 XML 文件
【发布时间】:2011-11-16 09:38:33
【问题描述】:

我正在创建一个非常大的 XML 文件 (700mb +),它通过批处理处理大量数据。该程序充当超大型 sybase 数据库和应用程序之间的接口。我目前将 xsd 模式绑定到类。我需要一种能够在考虑重启逻辑的情况下编写 XML 的方法。

I.E.能够知道我离开的地方。或者换句话说,如果程序失败,我需要能够查看最后写入 XML 文件的内容,以便它可以从我离开的地方继续。这是一个例子。

<root>
  <WorkSet>
    <Work>
      <Customer>
    <Work>
      <Customer>
  <WorkSet>
    <Work>
      .....
<root>

假设程序在写入写入“工作”或“工作集”节点后失败。有没有办法从我停止处理的地方继续?由于 XML 文件的剪切大小,我试图避免将 XML 文件读回内存(假设它完成了 500mb 的 XML 并失败)。

感谢您的帮助。

【问题讨论】:

    标签: java xml jaxb append application-restart


    【解决方案1】:

    如果您可以将数据拆分为独立的 WorkSet 元素,您可以使用 JAXB 的片段模式(当 JAXB 不写入标头时)一次将它们写出。稍后只需连接文件并添加缺少的 XML 声明,打开结束标记。

    您可能必须为此修改生成的类。我的意思是将@XmlRootElement 添加到WorkSet java 类。如果一个 WorkSet 对于一个步骤来说仍然很大,您也可以使用 Work 执行此操作,但您必须以某种方式生成丢失的标签。

    【讨论】:

    • 将@XmlRootElement 标记添加到WorkSet java 类会影响多个WorkSet 串联后一个大型XML 文件的功能吗?我对 JAXB 有点陌生,所以如果我理解不正确,请告诉我。
    • 我认为添加@XmlRootElement 不会影响您以前的功能。如果不添加@XmlRootElementMarshaller.marshal() 会引发以下异常:com.sun.istack.SAXException2: unable to marshal type "org.package.MyWorkSet" as an element because it is missing an @XmlRootElement annotation
    • 我能够仅编组 WorkSet 元素和所有子元素,而无需使用 JAXB 片段模式将 @XmlRootElement 添加到 WorkSet 类。但是现在,它将命名空间属性应用于 WorkSet 元素,这看起来很奇怪,因为当我编组之前的整个根元素和子元素时,它从来没有这个属性。有没有办法在 JAXB 中删除它,或者我只需要子串出来?
    • 如果它在没有@XmlRootElement 的情况下工作,请使用:) 在我的环境中,它会抛出提到的 SAXException2。
    【解决方案2】:

    我认为 JAXB 不适合这项工作,但是 ...

    您可以编写一个自定义 Marshaller 实现来跟踪已编组的对象并使用片段模式写出单个对象。

    【讨论】:

    • +1 JAXB 在这里听起来不像是正确的工具。为什么不只使用 SAX 解析器,您可以自己跟踪文件中的位置。以 StAX 为例...stax.codehaus.org/Home
    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2012-11-27
    • 2021-10-18
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    相关资源
    最近更新 更多