使用SAX解析XML文件。XML文件有1.5G,程序拋出了這個問題:
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萬個實體引用,你有辦法么?