常见的XML解析方式主要有jdom,sax等,不过jdom貌似用的更多点。
在开发中,我们可能会碰到XML解析相关的问题,至于xml结构定义相关的错误就不提了,无非就是多了空格,差个收尾标签之类的低级错误,相信你仔细找找肯定能发现症结所在。这里,我们就谈谈XML无法解析特殊字符的解决方法。
我们知道,XML解析器的解析原理肯定是利用一些特殊的标记符来分离XML文档中,基本的XML标签元素和标签内容的。完整的标签都是以<></>这种方式定义的,那么作为组成元素之一的'<'和'>',毫无疑问会被解析器特殊处理,说的书面一点,'<'和'>'就是XML中的预定义实体引用。XML中一共有五个类似的特殊实体引用:
那么如果我们想读取XML文件中这些特殊符号该怎么处理呢?比如'1<4',解析的时候肯定报语法错误了。
现在有两种解决方法:
1.用实体引用代替符号
2.使用CDATA处理特殊字符(CDATA 指的是不由 XML 解析器进行解析的文本数据)
值得注意的是,CDATA的文本内容中不能出现字符串“]]>”,且不可嵌套使用。
下面有个实例程序可供参考:
package jj.io; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; public class TestPushBackInputStream { public static void main(String[] args) { testXML(); } public static void testXML() { try { String path = "E:/xml01.xml"; SAXBuilder sb = new SAXBuilder(); InputStreamReader isr = new InputStreamReader(new FileInputStream(path),"gbk"); //Document doc1 = sb.build(new File(path));这种方式简单,但可能会碰到乱码问题 Document doc = sb.build(isr); Element ele = doc.getRootElement(); List<Element> eL = ele.getChildren("p"); for (Element e : eL) { System.out.println("#####"); System.out.println(e.getAttributeValue("name")); System.out.println(e.getText()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } } }
相关的XML文件如下:
<?xml version="1.0" encoding="gbk"?> <table> <p name="姜哥哥">帅帅哒!</p> <p name="特殊字符">><&"</p> <p name="CDATA"><![CDATA[<,>]]></p> </table>
解析出的效果如下:
##### 姜哥哥 帅帅哒! ##### 特殊字符 ><&" ##### CDATA <,>