常見的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
<,>