一、不含自定义字符或含较少量的特殊字符
一般的特殊字符有五个:&,,’(单引号),”(双引号)。这些字符如果直接出现在xml文档中,一般是不能解析出来的,如解析a&b时会报错。解决方法有两个:1.用标记;2.转义。
1.用标记
对于含特殊字符的element用标记起来即可成功解析,如
该方法简单但不实用,对于每个含特殊字符的element都要用标记。数量很少是推荐用这种方法。
2.转义
特殊字符数量很多时方法1显然不实用,此时可用转义来实现:
<
> >大于号
& &和
' '单引号
" "双引号
即将xml中的特殊文档全部替换为转义字符,如a&b变成a&b。
但是对于这种情况解析过程会发生变化,不是一次性解析a&b,而是分三步,先解析a,然后是&,然后是b,因此要注意想要获得中数据必须要用String变量将这三部分加起来。即解析程序中
StringBuffer contentBuffer = new StringBuffer();
publicvoidcharacters(char[] ch,intstart,intlength)
throwsSAXException {
if(this.tagName!=null){
contentBuffer.append(ch, start, length);//当出现特殊字符时会循环调用当前方法,若想使字符串完整解析,使用StringBuffer更好一点,否则只使用String的话只会得到末尾的部分字符串。
//String date=newString(ch,start,length);
//date就是当前节点(tagName)解析出来的数据
//example=example+date;
//example是已申明的用来存储中数据的Sting变量
}
}
这样解析出的example变量才是a&b,如果直接用example=date;得到的example的变量的只是b。
二、含自定义字符或含较多的特殊字符(用dtd文件验证)
DTD文件格式及验证xml原理(百度)
如何解析含DTD的xml文件呢?
将dtd文件导入当前工程,在xml文件中加入
src/dblp.dtd">即可。
如解析aüb,在dtd文件中声明
验证ü代表字符ü。
三、含单引号的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代表设定的单文件实体引用数最大值。