org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 語法分析器在此文檔中遇到多個 "64,000" 實體擴展; 這是應用程序施

使用SAX解析XML文件。XML文件有1.5G,程序拋出了這個問題:java

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 語法分析器在此文檔中遇到多個 "64,000" 實體擴展; 這是應用程序施加的限制。

參考來源:http://blog.csdn.net/a_heng/article/details/4566841緩存

 

查了查,原來是在單個xml文件中實體引用超過了默認值64000個。你用dom和sax解析XML均可能會遇到這個問題,這印證了個人猜想,java的dom是用sax來實現的。

解決方法很簡單,運行Java的時候,加上參數-DentityExpansionLimit=xxxxx,你也能夠在代碼中解析XML前,用代碼設置這個參數System.setProperty("entityExpansionLimit", "xxxxx");。xxxxx表明設定的單文件實體引用數最大值。

--------

那麼這個xxxxx該怎麼選擇呢?

其實也很簡單,選擇你認爲可能出現的最大值就行了,比你的文件裏面的實體數多,天然就沒問題了。

--------

那麼若是你想知道某個文件裏面有多少個實體引用該怎麼辦呢(放心我確定不建議你去數)?

對,也很簡單,首先咱們知道實體引用都是「&"開頭「;」結尾,因此咱們能夠用以下命令來計算:

grep -c "&.*;" yourfile.xml

其實,&在xml裏表示爲&的形式,因此,一個合法的xml內,有多少&就有多少實體引用,so,上面的命令效率更高的版本是:

grep -c "&" yourfile.xml

--------

爲何會對最大的實體引用數作出限制呢?這點我有些疑惑,難道要爲解析實體引用準備緩存空間?可是作出來自動增加的緩存也不是不可能的啊。DentityExpansionLimit參數的問題是,若是要處理沒法預期大小的xml文件怎麼辦?你設置爲100萬,xml文件裏面有200萬個實體引用,你有辦法麼?dom

相關文章
相關標籤/搜索