2

可能重复:
循环处理大型 XML 文件

什么是解析大型 XML 数据的更好方法,大型 XML 数据本质上是 Java 和基于 Java 的框架中的 XML 数据集合?我们从运行到几 MB(通常 25MB+)的 web 服务调用中获取数据。该数据本质上对应于一个未编组的对象列表。我的目标是从 XML 创建对象列表。

我尝试使用 SAX 解析器,解析这 3000 个对象需要 45 秒。

其他推荐的方法是什么?

4

4 回答 4

2

尝试拉解析,使用 StAX?第一次搜索比较: http ://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html

你有没有分析并看到瓶颈在哪里?

StAX 内置于 java 中(自 java 6 起),但有些人建议使用 woodstox StAX 实现以获得更好的性能。我还没有尝试过。http://woodstox.codehaus.org/

于 2012-05-09T19:58:09.953 回答
1

我尝试使用 SAX 解析器,解析这 3000 个对象需要 45 秒。其他推荐的方法是什么?

只有以下选项:

DOM  
SAX  
StAX  

SAX 是最快的SAXvsDOMvsStax,所以如果你切换到不同的风格,我认为你不会得到任何好处。
除非您现在做错了什么
当然还有编组/解组框架,例如 JAXB 等,但 IMO(未进行任何测量)它们可能会更慢,因为在 XML 处理上添加了额外的抽象层

于 2012-05-09T20:03:30.790 回答
0

SAX 不提供对 XML 文件结构的随机访问,这意味着 SAX 提供了一种相对快速和有效的解析方法。因为 SAX 解析器一次只处理一个元素,所以实现可以非常节省内存,使其通常成为处理大文件的一种选择。

于 2012-05-09T20:05:09.093 回答
0

解析 25Mb 的 XML 不应花费 45 秒。还有其他事情正在发生。也许大部分时间都花在等待从网络上获取外部 DTD 上,我不知道。在改变方法之前,您需要了解成本的来源,以及系统的哪些部分将从改变中受益。

但是,如果您确实想将 XML 转换为 Java 对象(不是我会选择的应用程序架构,但没关系),那么 JAXB 听起来不错。我没有过多地使用 JAXB,因为我更喜欢使用 XSLT 和 XQuery 等面向 XML 的语言,但是当我尝试 JAXB 时,我发现它非常快。当然,它在下面使用 SAX 或 StAX 解析器。

于 2012-05-10T08:41:31.000 回答