JAVA 解析XML文件

什麼是XML文件?

XML,可擴展的標識語言(eXtensibleMarkupLanguage)

XML是一種類似於HTML的標記語言,XML是用來描述數據的,XML的標記不是在XML中預定義的,你必須定義自己的標記,XML使用文檔類型定義(DTD)或者模式(Schema)來描述數據,XML使用DTD或者Schema後就是自描述的語言,XML(eXtensibleMarkupLanguage)是可擴展標記語言,它與HTML一樣,都是處於SGML,標準通用語言。Xml是Internet環境中跨平臺的,依賴於內容的技術,是當前處理結構化文檔信息的有力工具。擴展標記語言XML是一種簡單的數據存儲語言,使用一系列簡單的標記描述數據,而這些標記可以用方便的方式建立,雖然XML佔用的空間比二進制數據要佔用更多的空間,但XML極其簡單易於掌握和使用。

XML與HTML的語言風格相似,但他們之間也有很大的區別:

    1.XML擴展性比HTML強

XML(Extensible Markup Languages)是擴展標記語言的英語縮寫,他可以創建個性化的標記語言,可以稱之爲元語言。XML的標記語言可以自定義,這樣可以提供更多的數據操作,而不像HTML一樣,只能侷限於按一定的格式在終端顯示出來。HTML的功能只有瀏覽器放入顯示和打印,僅僅適合靜態網頁的要求。

2.XML的語法比HTML嚴格

由於XML的擴展性強,它需要穩定的基礎規則來支持擴展。它的嚴格規則爲:

①起始和結束的標籤相匹配

②嵌套標籤不能相互嵌套

③區分大小寫

相對應XML的嚴格規則,HTML語言並沒有規定標籤的絕對位置,也不區分大小寫,而這些全部由瀏覽器來完成識別和更正。

3.XML與HTML互補

XML可以獲得應用之間的相應信息,提供終端的多項處理要求,也能被其他的解析器和工具所使用,在現階段,XML可以轉化成相應的HTML,來適應當前瀏覽器的需求。

有什麼方法可以解析XML?

1.DOM

DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片斷的集合。這個層次結構允許開發人員在樹中尋找特定信息。分析該結構通常需要加載整個文檔和構造層次結構,然後才能做任何工作。由於它是基於信息層次的,因而DOM被認爲是基於樹或基於對象的。但是由於使用規則過於繁瑣,這裏我們不作介紹。

2.SAX

SAX解析器採用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件,當發現給定的tag的時候,它可以激活一個回調方法,告訴該方法制定的標籤已經找到。SAX對內存的要求通常會比較低,因爲它讓開發人員自己來決定所要處理的tag.特別是當開發人員只需要處理文檔中所包含的部分數據時,SAX這種擴展能力得到了更好的體現。但用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據,所以這裏也不作介紹。

3.JDOM

JDOM的目的是成爲Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了Collections類,簡化了那些已經熟悉這些類的Java開發者的使用。


接下來,來用JDOM簡單解析XML文件:

我們要解析這個XML文件,從中獲取每個Student元素裏的age、name、sex元素



我們要使用JDOM,就要獲取JDOM的jar包,關於文件jar包的獲取方法有兩種:

一:下載JDOM的jar包,然後把jar包導入到相關項目中

這是JDOM  2.05的下載鏈接:http://mvnrepository.com/artifact/org.jdom/jdom2/2.0.5

二:導入jar包的<dependency></dependency>(博主推薦)

把項目轉成maven屬性的項目,然後去mvn資源庫中把要用到的jar包的<dependency></dependency>放入到pom.xml中


具體如何操作可以參考鏈接:

http://blog.csdn.net/ricky73999/article/details/54989972

導入包後,我們來進行代碼演示(部分代碼有註釋)

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class JdomDemo {
	public static void test1(){
		//使用SAXBuilder爲解析XML搭建通道
		SAXBuilder sb=new SAXBuilder();
		try {
			//讀取文件,並把文件轉成DOC對象,便於後面的解析
			Document doc =sb.build(new FileInputStream("src/b.xml"));
			//獲取文件的根元素,也就是最外層的元素Students
			Element rootElement=doc.getRootElement();
			//獲取根元素下的所有子元素,存取在List中
			List<Element> elementList=rootElement.getChildren();
			for (Iterator iterator = elementList.iterator(); iterator.hasNext();) {
				//獲取每個student元素
				Element element = (Element) iterator.next();
				//獲取student的子元素name、age、sex的內容,並輸出
				String name=element.getChildText("name");
				String age=element.getChildText("age");
				String sex=element.getChildText("sex");
				System.out.println(name);
				System.out.println(age);
				System.out.println(sex);
			}
		} catch (JDOMException | IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		test1();
	}
}




4.DOM4J(DOM for java)

DOM4J是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫 XML,特別值得一提的是連Sun的JAXM也在用DOM4J,目前最多人用來解析XML的工具。

首先同樣把DOM4J的jar包導入項目中,寫代碼時注意import的包名,小心導入JDOM的包了。

我們同樣獲取如上的目標元素的內容,然後來比較一下代碼的區別。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;

public class Dom4jDemo {
	public static void test1(){
		//SAXReader對象可以傳入輸入流或者文件
		SAXReader reader=new SAXReader();
		try {
			//讀取文件,並把文件轉成DOC對象,便於後面的解析
			Document doc=reader.read(new FileInputStream("src/b.xml"));
			//獲取文件的根元素,也就是最外層的元素Students
			Element rootElement=doc.getRootElement();
			//獲取根元素下的所有子元素,存取在List中
			List<Element> listElement=rootElement.elements();
			for (Iterator iterator = listElement.iterator(); iterator.hasNext();) {
				//獲取每個student元素
				Element element = (Element) iterator.next();
				//獲取student元素下的name、age、sex的元素的內容
				String name=element.elementText("name");
				String age=element.elementText("age");
				String sex=element.elementText("sex");
				System.out.println(name);
				System.out.println(age);
				System.out.println(sex);
			}
		} catch (FileNotFoundException | DocumentException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		test1();
	}
}


對比了一下,本人覺得JDOM 與DOM4J的解析過程極爲形似,但DOM4J是由JDOM演變而來的,使得DOM4J的語言風格更容易讓人理解接受,調用的方法名也比較好理解相對於JDOM。

還有就是,JDOM和DOM在性能測試時表現不佳,在測試10M文檔時內存溢出。在小文檔情況下還值得考慮使用DOM和JDOM.雖然JDOM的開發者已經說明他們期望在正式發行版前專注性能問題,但是從性能觀點來看,它確實沒有值得推薦之處。

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