在java中解析非常大的XML文档(以及更多)

2022-09-02 13:03:29

(以下所有内容都将用Java编写)

我必须构建一个应用程序,该应用程序将采用可能非常大的 XML 文档作为输入。文档已加密 - 不是使用XMLsec,而是使用我的客户端先前存在的加密算法 - 将分三个阶段处理:

首先,流将根据上述算法进行解密。

其次,扩展类(由第三方编写到我提供的API)将读取文件的某些部分。读取的量是不可预测的 -- 特别是它不能保证在文件的标头中,但可能发生在 XML 中的任何位置。

最后,另一个扩展类(相同的交易)将输入 XML 细分为 1..n 子集文档。这些可能在某些部分与第二个操作处理的文档部分重叠,即:我相信我需要倒退我用来处理此对象的任何机制。

这是我的问题:

有没有办法做到这一点,而不必一次将整个数据读取到内存中?显然,我可以将解密实现为输入流过滤器,但我不确定是否有可能以我描述的方式解析XML;通过遍历文档的大部分内容来收集第二步的信息,然后通过倒带文档并再次传递它以将其拆分为作业,理想情况下,释放文档中所有在通过后不再使用的部分。


答案 1

Stax是正确的方法。我建议看看Woodstox


答案 2

这听起来像是StAX(JSR 173)的工作。StAX是一个拉取解析器,这意味着它的工作方式或多或少像SAX这样的基于事件的解析器,但是您可以更好地控制何时停止读取,拉取哪些元素,...

此解决方案的可用性将在很大程度上取决于您的扩展类实际执行的操作,您是否可以控制它们的实现,等等...

重点是,如果文档非常大,您可能希望使用基于事件的解析器而不是基于树的分析器,因此您不会使用大量内存。

StAX的实现可以从SUN(SJSXP),Codehaus或其他一些提供商那里找到。