XML解析及相關問題

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章