解析中常见错误
程序员文章站
2022-04-13 22:03:07
...
dom4j常见错误
1.
问题:使用Dom4j解析大文件时内存溢出的问题
当我用dom4j去解析一个几十M的xml时,就出现out of memory.当然了,这也是根据你的机器性能而定的,我们都知道dom4j在各种DOM解析器中应该算是性能最好的,连大名鼎鼎的Hibernate都是用dom4j来解析XML配置文件的
分析: 问题出在于使用dom4j的SAXReader是会把整个XML文件一次性读入,如果XML文件过大就会抛出out of memory,但即使是使用SAXParser批量读入解析,但它也是一次解析完,假设XML文件有几万条数据,那么解析后就必须在内存放入这几万条对象
解决:
常用的Dom4j文件解析方式:
InputStream is = new FileInputStream(filePath);
SAXReader reader = new SAXReader(); //将整个XML构建为一个Document
Document doc = reader.read(is);
Element root = doc.getRootElement(); // 获得根节点
for (Object obj : root.elements()) { // 遍历每个节点
Element e = (Element)obj; // 对当前节点进行操作
解决方法:使用ElementHandler解析文件
参考网址:http://blog.sina.com.cn/s/blog_6cee57af0100q54e.html
2.
问题:使用java.io.Reader读取XML文件进行解析时出现异常
org.dom4j.DocumentException: Error on line 1 of document : Content is not allowed in prolog.
Nested exception:
org.xml.sax.SAXParseException: Content is not allowed in prolog
分析:UTF-8编码文件存在BOM头,Reader类无法正确识别
解决: (1).使用16进制编辑器手动删除BOM头
(2).InputStream读取流中前面的字符,看是否有BOM,如果有BOM,干掉BOM头
(3).InputStream读取完文件,干掉BOM头
参考网址:http://blog.sina.com.cn/s/blog_6cee57af0100q54e.html
3.
问题:解析XML文件时出现非法字符的Exception(即使该字符位于CDATA段内):
org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0xb) was found in the CDATA section.
分析:根据W3C标准,有一些字符不能出现在XML文件中:0x00 - 0x08, 0x0b - 0x0c, 0x0e - 0x1f解析XML时遇到这些字符就会出错
解决:对有可能出问题的XML文件,进行字符过滤后再进行解析(如:[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f])
参考网址:http://blog.sina.com.cn/s/blog_6cee57af0100q54e.html
JDOM常见错误
1.
错误:org.jdom.input.JDOMParseException: Error on line 0: The encoding "GB18030" is not supported.
分析:应该是你的xml文件中第一行定义了encoding="GB18030",而这个dom解析器,不支持这种编码。
解决:更改编码
2.
错误:java.net.MalformedURLException
报java.net.MalformedURLException,发现运行到builder.build(xml)时报错
分析:传入个字符串格式不规范,我直接传入一个流进去,改过后的代码:
SAXBuilder builder=new SAXBuilder(false);
StringReader reader = new StringReader(xml); //用reader读取字符串,xml为已字符串
Document doc=builder.build(new InputSource(reader));
Element result=doc.getRootElement();
Element code=result.getChild("code");
参考网址:http://blog.sina.com.cn/s/blog_6f7d179e01013otz.html
sax常见问题
1.
问题: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代表设定的单文件实体引用数最大值。
参考网址:http://blog.csdn.net/a_heng/article/details/4566841