在SAX解析器中解析大型XML文件时没有内存的异常

时间:2015-04-02 19:20:03

标签: java xml parsing

我已经阅读了一些关于使用SAX解析器在java中使用DOM解析XML文件的优点的文章。 最吸引我的那个(正如所讨论的here)就是那个

  

Sax适用于大型XML文件,而SAX解析器不会将XML文件作为整体加载到内存中。

但是现在我已经编写了一个解析器,使用SAX从XML文件中导出几乎 1.4 GB 的大文件中的实体,它会生成以下异常。

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; The parser has encountered more than "64,000" entity expansions in this document; this is the limit imposed by the application.

如果整个文件没有加载到内存中,内存有什么问题。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

使用JVM参数更改实体扩展限制:

-DentityExpansionLimit=1000000

答案 1 :(得分:0)

您也可以考虑使用StAX。

SAX是事件驱动和串行的。它可以处理大型XML,但占用大量CPU资源。

DOM正在将完整的文档记录在内存中。

StAX是一种更新的API。它是通过XML流式传输的。它可以看作是文档上的游标或迭代器。它的优点是可以跳过不需要的元素(属性,标签......)。如果使用得当,它可以减少很少的CPU资源。

https://docs.oracle.com/javase/tutorial/jaxp/stax/why.html

使用SAX,XML会推动事件。

使用StAX,您可以将XML提取给您。