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

相关文章
相关标签/搜索