首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在java中解析非常大的XML文档(甚至更多)

在java中解析非常大的XML文档(甚至更多)
EN

Stack Overflow用户
提问于 2008-12-10 12:41:02
回答 4查看 24.5K关注 0票数 19

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

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

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

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

最后,另一个扩展类(同样的处理)将把输入的XML细分为1..n个子集文档。这些可能会在某种程度上与第二个操作处理的文档部分重叠,即:我相信我将需要回溯我正在使用的处理此对象的任何机制。

这是我的问题:

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-10 13:41:26

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

票数 12
EN

Stack Overflow用户

发布于 2008-12-10 13:24:46

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

这个解决方案的可用性在很大程度上取决于你的扩展类实际在做什么,如果你能控制它们的实现,等等……

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

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

票数 7
EN

Stack Overflow用户

发布于 2008-12-10 12:59:38

您可以使用具有非常大缓冲区大小的BufferedInputStream,在扩展类工作之前使用mark(),在扩展类工作之后使用reset()

但是,如果扩展类需要的部分位于文件中很远的地方,那么这可能会变得非常占用内存。

一种更通用的解决方案是编写自己的BufferedInputStream-workalike,如果要缓冲的数据超过某个预设阈值,则将其缓冲到磁盘。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/355909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档