一、不含自定义字符或含较少量的特殊字符

 

一般的特殊字符有五个:&,<,>,’(单引号),”(双引号)。这些字符如果直接出现在xml文档中,一般是不能解析出来的,如解析<example>a&b<example>时会报错。解决方法有两个:1.用<![CDATA[ ]]>标记;2.转义。

 

1.  用<![CDATA[ ]]>标记

 

对于含特殊字符的element用<![CDATA[ ]]>标记起来即可成功解析,如<example><![CDATA[a&b]]><example>

 

该方法简单但不实用,对于每个含特殊字符的element都要用<![CDATA[ ]]>标记。数量很少是推荐用这种方法。

 

2.  转义

 

特殊字符数量很多时方法1显然不实用,此时可用转义来实现:

 

&lt; < 小于号

 

&gt; > 大于号

 

&amp; & 和

 

&apos; ' 单引号

 

&quot; " 双引号

 

即将xml中的特殊文档全部替换为转义字符,如<example>a&b<example>变成<example>a&amp;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&uuml;b<example>,在dtd文件中声明

 

<!ENTITY uuml "&#252;"><!-- small u, dieresis or umlaut mark --> 验证&uuml;代表字符ü。

 

三、含单引号的xml解析后插入数据库:

 

用上面方法可以解析出xml中含单引号的数据(String型数据),但要将数据插入数据库中却很容易出现问题,因为sql语句中不允许单独的单引号存在,解决办法很简单,将解析所得的数据中的单引号用函数replaceAll()替换成双引号在插入数据库即可。

 

四、解析含较多实体引用的大型的xml文档(如1G)

 

xml实体引用都是以&开头,以;结尾,如第二大点中的&uuml;就是一个实体引用。对于大型的xml文档,含有的实体引用可能太多导致解析过程报错:Parser has reached the entity expansion limit "64,000" set by the Application.

 

即单个xml文件中实体引用超过了默认值64000个。这时只要在解析前设置单个xml文件中实体引用的最大数量即可,System.setProperty("entityExpansionLimit", "xxxxx");。xxxxx代表设定的单文件实体引用数最大值。