1. 程式人生 > >解析xml檔案時,錯誤資訊org.xml.sax.SAXParseException:Parser has reached the entity expansion limit "64,000" set by the Application.的解決辦法

解析xml檔案時,錯誤資訊org.xml.sax.SAXParseException:Parser has reached the entity expansion limit "64,000" set by the Application.的解決辦法

最近一個處理非常大的XML的程式遭遇瞭如下的異常:

org.xml.sax.SAXParseException:Parser has reached the entity expansion limit "64,000" set by the Application.

(org.xml.sax.SAXParseException: 分析器已達到由應用程式設定的實體擴充套件限制“64,000”。)

查了查,原來是在單個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萬個實體引用,你有辦法麼?