2015-04-02 63 views
2

我已閱讀了一些關於使用SAX解析器在Java中解析XML文件以使用DOM的優點的文章。 這吸引我的一個最(如討論here)是在SAX解析器中解析大型XML文件時無內存異常

薩克斯是適合大型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. 

如果整個文件沒有加載到內存中,內存的問題是什麼?

我該如何解決這個問題?

+3

這不一定是一個實際的內存限制,而是針對[this one](https://en.wikipedia.org/wiki/Billion_laughs)等DOS攻擊的保護措施。如果你的輸入XML合法地包含了許多實體,你可以在你的解析器中增加這個限制。看看它的文檔。 – Tomalak 2015-04-02 19:25:30

+0

你建議我用這種保護措施做什麼? – 2015-04-02 19:31:36

+0

我以爲我說過。 – Tomalak 2015-04-02 19:38:37

回答

3

變化的實體擴展限制了JVM參數:

-DentityExpansionLimit=1000000 
+0

該怎麼辦? – 2015-04-02 19:29:14

+0

取決於你如何運行你的程序。這是一個命令行參數。 – Necreaux 2015-04-02 19:32:51

+0

這篇文章http://stackoverflow.com/questions/29360901/getting-parent-child-hierarchy-in-sax-xml-parser包含我的代碼爲解析器希望你明白我是如何處理它 – 2015-04-02 19:34:57

0

您也可以考慮使用StAX的。

SAX是事件驅動和串行。它可以處理大型XML,但佔用大量CPU資源。

DOM正在內存中取出完整的文件。

StAX是一個更新的API。它正在流式傳輸XML。它可以被看作是文檔上的遊標或迭代器。它的優點是可以跳過不需要的元素(屬性,標籤...)。如果使用得當,它會佔用很少的CPU資源。

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

用SAX,該XML推的事件。

使用StAX,您可以將XML提供給您。

+0

這是否意味着我所有的努力都會創建一個解析器(使用SAX),實際上,對於較小尺寸的文件而言,效果很好? – 2015-04-02 19:36:34

+0

不可以。如果你已經解決了你的問題,你可以堅持SAX。我只是想告訴你,還有另一種解析XML的現代方法。另一個優點:用SAX u只能解析XML,用StAX u也可以編寫XML。 – 2015-04-02 19:41:04

+0

好吧,沒錯,但我還沒有得到任何修復。 – 2015-04-02 19:42:28