<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><entry xmlns='http://www.w3.org/2005/Atom' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-6184036.post-7433080176343394424</id><published>2007-08-16T02:13:00.001+08:00</published><updated>2008-06-26T01:38:01.373+08:00</updated><title type='text'>错误信息org.xml.sax.SAXParseException:Parser has reached the entity expansion limit "64,000" set by the Application.啥意思？</title><content type='html'>最近一个处理非常大的XML的程序遭遇了如下的异常：&lt;br /&gt;&lt;br /&gt;org.xml.sax.SAXParseException:Parser has reached the entity expansion limit "64,000" set by the Application.&lt;br /&gt;&lt;br /&gt;查了查，原来是在单个xml文件中实体引用超过了默认值64000个。你用dom和sax解析XML都可能会遇到这个问题，这印证了我的猜测，java的dom是用sax来实现的。&lt;br /&gt;&lt;br /&gt;解决方法很简单，运行Java的时候，加上参数&lt;span style="color: rgb(0, 0, 173);"&gt;-DentityExpansionLimit=xxxxx&lt;/span&gt;，你也可以在代码中解析XML前，用代码设置这个参数&lt;span style="color: rgb(255, 0, 0);"&gt;System.setProperty("entityExpansionLimit", "xxxxx");&lt;/span&gt;。xxxxx代表设定的单文件实体引用数最大值。&lt;br /&gt;&lt;br /&gt;--------&lt;br /&gt;&lt;br /&gt;那么这个xxxxx该怎么选择呢？&lt;br /&gt;&lt;br /&gt;其实也很简单，选择你认为可能出现的最大值就好了，比你的文件里面的实体数多，自然就没问题了。&lt;br /&gt;&lt;br /&gt;--------&lt;br /&gt;&lt;br /&gt;那么如果你想知道某个文件里面有多少个实体引用该怎么办呢（放心我肯定不建议你去数）？&lt;br /&gt;&lt;br /&gt;对，也很简单，首先我们知道实体引用都是“&amp;"开头“;”结尾，所以我们可以用如下命令来计算：&lt;br /&gt;&lt;br /&gt;grep -c "&amp;.*;" yourfile.xml&lt;br /&gt;&lt;br /&gt;其实，&amp;在xml里表示为&amp;amp;的形式，所以，一个合法的xml内，有多少&amp;就有多少实体引用，so，上面的命令效率更高的版本是：&lt;br /&gt;&lt;br /&gt;grep -c "&amp;amp;" yourfile.xml&lt;br /&gt;&lt;br /&gt;--------&lt;br /&gt;&lt;br /&gt;为什么会对最大的实体引用数做出限制呢？这点我有些疑惑，难道要为解析实体引用准备缓存空间？但是做出来自动增长的缓存也不是不可能的啊。DentityExpansionLimit参数的问题是，如果要处理无法预期大小的xml文件怎么办？你设置为100万，xml文件里面有200万个实体引用，你有办法么？&lt;p&gt;&lt;img id="image329" src="http://freehogg.files.wordpress.com/2006/04/technorati.gif" alt="Technorati" /&gt; technorati tags: &lt;a href="http://www.technorati.com/tags/DentityExpansionLimit" rel="tag"&gt;DentityExpansionLimit&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/dom" rel="tag"&gt;dom&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/Javascript" rel="tag"&gt;Javascript&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/java异常" rel="tag"&gt;java异常&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/sax" rel="tag"&gt;sax&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/SAXParseException" rel="tag"&gt;SAXParseException&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/xml" rel="tag"&gt;xml&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;p&gt;&lt;a href="http://www.tinydust.net"&gt;Tinydust studio&lt;/a&gt;&lt;/p&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6184036-7433080176343394424?l=www.tinydust.net%2Fprog%2Fdiary%2Fdiary.htm'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/6184036/7433080176343394424/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment.g?blogID=6184036&amp;postID=7433080176343394424' title='4 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6184036/posts/default/7433080176343394424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6184036/posts/default/7433080176343394424'/><link rel='alternate' type='text/html' href='http://www.tinydust.net/prog/diary/2007/08/orgxmlsaxsaxparseexceptionparser-has.html' title='错误信息org.xml.sax.SAXParseException:Parser has reached the entity expansion limit &quot;64,000&quot; set by the Application.啥意思？'/><author><name>tiny</name><uri>http://www.blogger.com/profile/14126154625633923315</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='00577701193264776111'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>4</thr:total></entry>