一、不含自定义字符或含较少量的特殊字符
一般的特殊字符有五个:&,<,>,’(单引号),”(双引号)。这些字符如果直接出现在xml文档中,一般是不能解析出来的,如解析<example>a&b<example>时会报错。解决方法有两个:1.用<![CDATA[ ]]>标记;2.转义。
1. 用<![CDATA[ ]]>标记
对于含特殊字符的element用<![CDATA[ ]]>标记起来即可成功解析,如<example><![CDATA[a&b]]><example>
该方法简单但不实用,对于每个含特殊字符的element都要用<![CDATA[ ]]>标记。数量很少是推荐用这种方法。
2. 转义
特殊字符数量很多时方法1显然不实用,此时可用转义来实现:
< < 小于号
> > 大于号
& & 和
' ' 单引号
" " 双引号
即将xml中的特殊文档全部替换为转义字符,如<example>a&b<example>变成<example>a&b<example>。
但是对于这种情况解析过程会发生变化,不是一次性解析a&b,而是分三步,先解析a,然后是&,然后是b,因此要注意想要获得<example>中数据必须要用String变量将这三部分加起来。即解析程序中
StringBuffer contentBuffer = new StringBuffer();
public void characters(char[] ch, int start, int length)
throws SAXException {
if(this.tagName!=null){
contentBuffer.append(ch, start, length);//当出现特殊字符时会循环调用当前方法,若想使字符串完整解析,使用StringBuffer更好一点,否则只使用String的话只会得到末尾的部分字符串。
//String date=new String(ch,start,length);
//date就是当前节点(tagName)解析出来的数据
//example=example+date;
//example是已申明的用来存储<example>中数据的Sting变量
}
}
这样解析出的example变量才是a&b,如果直接用example=date;得到的example的变量的只是b。
二、含自定义字符或含较多的特殊字符(用dtd文件验证)
DTD文件格式及验证xml原理(百度)
如何解析含DTD的xml文件呢?
将dtd文件导入当前工程,在xml文件中加入
<!DOCTYPE xml文件名 SYSTEM "src/dblp.dtd">即可。
如解析<example>aüb<example>,在dtd文件中声明
<!ENTITY uuml "ü"><!-- small u, dieresis or umlaut mark --> 验证ü代表字符ü。
三、含单引号的xml解析后插入数据库:
用上面方法可以解析出xml中含单引号的数据(String型数据),但要将数据插入数据库中却很容易出现问题,因为sql语句中不允许单独的单引号存在,解决办法很简单,将解析所得的数据中的单引号用函数replaceAll()替换成双引号在插入数据库即可。
四、解析含较多实体引用的大型的xml文档(如1G)
xml实体引用都是以&开头,以;结尾,如第二大点中的ü就是一个实体引用。对于大型的xml文档,含有的实体引用可能太多导致解析过程报错:Parser has reached the entity expansion limit "64,000" set by the Application.
即单个xml文件中实体引用超过了默认值64000个。这时只要在解析前设置单个xml文件中实体引用的最大数量即可,System.setProperty("entityExpansionLimit", "xxxxx");。xxxxx代表设定的单文件实体引用数最大值。