我有以下问题:我有非常大的 XML 文件(例如 300+ Megs),我需要解析它们以便将它们的一些值添加到数据库中。这些文件的结构也非常复杂。我想使用 Stax Parser,因为它提供了一次仅拉解析(从而处理)XML 文件的一部分的良好可能性,因此不会将整个文件加载到内存中,但另一方面可以使用以下命令获取值Stax(至少在这些 XML 文件上)很麻烦,我需要编写大量代码。从后一个角度来看,如果我可以将 XML 文件编组为 Java 对象(就像 JAX-B 所做的那样),这将对我有很大帮助,但是这会一次性加载整个文件以及内存中的大量对象实例。
我的问题是,是否有某种方法可以按顺序提取解析(或部分解析)文件,然后仅将这些部分编组到 Java 对象,以便我可以轻松处理它们,而不会陷入内存困境?
我推荐 Eclipse EMF。但它也有同样的问题,如果你给它文件名,它会解析整个文件。虽然有一些选项可以减少加载量,但我并没有太在意,因为我们在 96 GB RAM 的机器上运行。 :)
不管怎样,如果您的 XML 格式定义良好,那么一种解决方法就是通过将整个文件分解为几个较小的(但仍然定义良好的)XML 片段来欺骗 EMF。然后一个接一个地输入每个片段。我不了解 JAX-B,但也许同样的解决方法也适用于那里。我会推荐这个,因为对于这么小的问题来说,EMF 太大了。
如果您的 XML 如下所示,请详细说明一下:
<tag1>
<tag2>
<tag3/>
<tag4>
<tag5/>
</tag4>
<tag6/>
<tag7/>
</tag2>
<tag2>
<tag3/>
<tag4>
<tag5/>
</tag4>
<tag6/>
<tag7/>
</tag2>
............
<tag2>
<tag3/>
<tag4>
<tag5/>
</tag4>
<tag6/>
<tag7/>
</tag2>
</tag1>
然后它可以分解为一个 XML,每个 XML 开头为<tag2>
并以</tag2>
。在java中,大多数解析器都会接受Stream,因此只需使用您想要的任何内容进行解析,为每个解析器创建一些StringStream或其他东西<tag2>
循环并传递给 JAX-B 或 EMF。
HTH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)