Java / XML:良好的“基于流”的JAXB替代方案?

时间:2010-04-06 16:37:10

标签: xml jaxb

JAXB使得使用XML变得更加容易,但我目前面临一个很大的问题,即我必须处理的文件对于JAXB所做的内存解组来说太大了。每个文档的数据最多可达4GB。

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

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

可能有问题:

  1. JAXB是否可能以某种方式支持以“流式”方式进行解组,这不需要在内存中构建整个ob​​jecttree,而是逐个元素地为元素提供某种“Iterator”? (也许我只是错过了某种方式......)

  2. 如果没有你的建议,有什么好的选择 一个。 “平坦的学习曲线,理想情况与JAXB非常相似 湾非常重要:理想情况下,使用从XSD文件或带注释的Java类生成unarshaller代码的可能性/工具

  3. 3.(我已经搜索了SO和那些最终出现在我的“关注列表”上的库(没有比较接近)是Apache XML Beans和Xstream ...... 其他哪些图书馆的目的可能更好,有哪些缺点,adavangaes ......

    非常感谢!!! 扬

4 个答案:

答案 0 :(得分:3)

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

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

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

这让你有一个很好的'ol SAX。众所周知,通过SAX,你会得到蓝调。因为它是如此原始的层。但它是最有效的,并且给你最大的控制权。

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

SAX并不是那么糟糕,我写了一个很好的小粗略映射器,它允许你做你想做的事情,除了你必须手动编码而不是使用XSD,它在Obj-C中,不是Java。但基本上它走了XML流,并根据路径名查找类的setter。这取代了使用SAX代码获得的元素回调中典型的巨大“if element =”名称“...”链。

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

答案 1 :(得分:2)

我会挖掘JAXB / StAX方法(对于基于流的东西,但使用类型化的Java对象)。看看this post(虽然更多的提示而不是强大的领导)。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

我很长时间以前写过这样一个library - 6年多以前,用于Java 1.4。 自从我完成博士学位以来,由于使用内部API在生成的Java代码上调用javac,因此它一直处于未触及状态,并且不适用于现代JVM。

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

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

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