(以下所有内容均以Java编写)
我必须构建一个应用程序,它将输入可能非常大的XML文档作为输入.该文档是加密的 - 不是使用XMLsec,而是使用我客户的预先存在的加密算法 - 将分三个阶段进行处理:
首先,根据上述算法对流进行解密.
其次,扩展类(由我提供的API的第三方编写)将读取文件的某些部分.读取的数量是不可预测的 - 特别是它不能保证在文件的标题中,但可能出现在XML中的任何位置.
最后,另一个扩展类(相同的交易)将输入XML细分为1..n子集文档.这些可能会在某些方面与第二个操作处理的文档部分重叠,即:我相信我需要回放我用来处理这个对象的任何机制.
这是我的问题:
有没有办法在没有一次将整个数据读入内存的情况下执行此操作?显然我可以将解密实现为输入流过滤器,但我不确定是否可以按照我描述的方式解析XML; 通过遍历,需要收集第二步的信息,然后通过倒回文档并再次传递它以将其拆分为作业,理想情况下释放文档的所有不再使用的部分他们已经通过了.
Stax是正确的方法.我建议看看Woodstox
这听起来像是StAX(JSR 173)的工作.StAX是一个拉解析器,这意味着它或多或少像SAX这样的基于事件的解析器,但你可以更好地控制何时停止读取,拉动哪些元素,......
此解决方案的可用性将在很大程度上取决于您的扩展类实际执行的操作,是否可以控制其实现等...
重点是,如果文档非常大,您可能希望使用基于事件的解析器而不是基于树的,因此您不会使用大量内存.
可以从SUN(SJSXP),Codehaus或其他一些提供商处找到StAX的实现.