【问题标题】:Java/XML: Good "Stream-based" Alternative to JAXB?Java/XML:JAXB 的“基于流”的良好替代方案?
【发布时间】:2010-04-06 16:37:10
【问题描述】:

JAXB 使处理 XML 变得如此容易,但我目前有一个大问题,即我必须处理的文档太大,无法像 JAXB 那样在内存中解组。每个文档的数据最多可达 4GB。

我必须处理的数据结构非常简单扁平:有一个根元素和数百万个“元素”……

<root>
<element>
<sub>foo</sub>
</element>
<element>
<sub>foo</sub>
</element>
</root>

可能的问题是:

  1. JAXB 是否可能以某种方式支持以“基于流”的方式进行解组,这种方式不需要在内存中构建整个对象树,而是为我提供某种“迭代器”,逐个元素地访问元素? (也许我只是以某种方式错过了……)

  2. 如果不是,您对一个好的替代方案有什么建议? 一种。 “平坦的学习曲线,理想情况下与 JAXB 非常相似 湾。并且非常重要:理想情况下,可以使用从 XSD 文件或带注释的 Java 类生成 unarshaller 代码的可能性/工具

3.(我已经搜索了 SO 和那些最终出现在我的“关注列表”中的库(没有更进一步地比较它们)是 Apache XML Beans 和 Xstream... 有哪些其他库可能更好地达到此目的,有哪些缺点,优点……

非常感谢!!! 一月

【问题讨论】:

    标签: xml jaxb


    【解决方案1】:

    这些都是错误的方法,因为它们基本上都是“bean”映射器。即,将 XML 文档转换为 Java Bean。为了做到这一点,你几乎必须把整个东西都吸进机器里。

    现在,显然有“更好”的方法可以做到。例如,实际上不需要加载整个 XML DOM 来映射 bean,但我不知道 JAXB 等人实际上如何执行它们的序列化。我怀疑他们不会打扰 DOM,而是直接填充 bean 字段,因为 XML 是流式传输的。这将节省整体处理,但您最终仍将整个文档作为一组类实例保存在 RAM 中。

    现在,如果您只需要一点 XML 文档,您可能需要考虑 StAX 实现。这是一个基于流解析器的类 DOM 接口。虽然最终这可能不是很好,因为我认为这些工作是通过流式传输尽可能多的文档来实现的,这意味着如果你需要在前面的东西,你就赢了,因为它可以把剩下的东西扔掉。但如果你最后想要一些东西,我认为它保留了当时看到的大部分内容。这也不好。

    这会给您留下很好的“ol SAX”。每个人都知道,使用 SAX,您会得到蓝调。因为它是如此原始的层。但它是最有效的,并且为您提供最大的控制权。

    XSD 映射会很困难,仅仅是因为映射框架的美妙之处在于它们知道如何处理所有元素(它们创建类实例,并将它们填充到父类中)。你想做一些不同的事情,在任意点做一些随意的事情。

    SAX 还不错,我写了一个不错的小粗略映射器,它允许你做你想做的事,省去你必须手动编码而不是使用 XSD,它在 Obj-C 中,不是Java。但基本上它遍历 XML 流并根据路径名查找类的设置器。这取代了您使用 SAX 代码获得的元素回调中典型的巨大“if element = "name"...”链。

    这不是你要找的答案,我敢肯定...如果我被证明是错的,我会很高兴。

    【讨论】:

    • 在我看来,SAX 不一定是最好的方法,也不一定是最有效的
    【解决方案2】:

    我会挖掘 JAXB/StAX 方法(用于基于流但具有类型化 Java 对象的东西)。看看this post(虽然更多的是暗示而不是强有力的领先)。

    【讨论】:

      【解决方案3】:

      大文档数据绑定的关键是使用XPath只选择你需要的项目并过滤掉其他所有内容......请参阅下面的文章

      http://onjava.com/pub/a/onjava/2007/09/07/schema-less-java-xml-data-binding-with-vtd-xml.html

      【讨论】:

        【解决方案4】:

        我在很久很久以前 - 6 多年前为 Java 1.4 写过这样的 library。 自从我完成博士学位以来,它一直没有受到影响,并且由于使用内部 API 在生成的 Java 代码上调用 javac 而无法在现代 JVM 上运行。

        RP Bourret 维护了一个list 可能感兴趣的数据绑定相关工具。

        我建议使用 Apache Commons Digester 项目,因为它构建在 SAX 之上。一个旧的tutorial 显示了它的用途。要点是您在 XML 中设置嵌套元素模式与 Java 中的操作(例如,创建新对象、设置字段)的映射,以构建您的数据结构,并且您可以将每个项目的处理挂接到该系统中。

        请注意,消化系统不是从 Schema 生成的,或者类似于 JAXB - 但我认为考虑到结构的简单性和输入大小,这应该不是主要问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-10
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          相关资源
          最近更新 更多