XML解析詳解|樂字節

大家好,樂字節的小樂又來了,Java技術分享哪裏少的了小樂!上次我們說了可擴展標記語言XML之二:XML語言格式規範、文檔組成,本文將介紹重點——XML解析。
圖片描述

基本的解析方式有兩種:一種叫 SAX,另一種叫 DOM。

SAX(Simple API for XML)是基於 事件流的解析,DOM(Document Object Model)是基於 XML 文檔樹結構的解析。SAX:效 率高,數據量小,僅一次獲取 。

DOM:整顆樹加載到內存中,耗內存,可多次獲取。

一、DOM 解析

與 js 中的類似,使用 JAXP(Java API for XML Parsing),即:用於 XML 解析的 Java API.

DOM(Document Object Model, 文檔對象模型),在應用程序中,基於 DOM 的 XML

分析器將一個 XML 文檔轉換成一個對象模型的集合(通常稱爲 DOM 樹),應用程序正是通過對這個對象模型的操作,來實現對 XML 文檔數據的操作。

XML 本身是以樹狀的形式出現的,所以 DOM 操作的時候,也將按章樹的形式進行轉換。 在整個 DOM 樹種,最大的地方指的是 Document,表示一個文檔,在這個文檔中存在一個根節點。

注意:在使用 DOM 操作的時候,每一個文字的區域也是一個節點,稱爲文本節點。

1、核心操作接口

在 DOM 解析中有以下四個核心的操作接口

Document : 此接口代表了整個 XML 文檔,表示的是整棵 DOM 樹的根,提供了對文檔中的數據進行訪問和操作的入口,通過 Document 節點可以訪問 XML 文件中所有的元素內容。

Node : 此接口在整個 DOM 樹種具有舉足輕重的低位,DOM 操作的核心接口中有很大 一部分接口是從 Node 接口繼承過來的。例如:Document、Element 等接口,在 DOM 樹種,每一個 Node 接口代表了 DOM 樹種的一個節點。

NodeList : 此接口表示的是一個節點的集合,一般用於表示有順序關係的一組節點,

例如:一個節點的子節點,當文檔改變的時候會直接影響到 NodeList 集合。

NamedNodeMap : 此接口表示的是一組節點和其唯一名字對應的一一對應關係,本

接口主要用於屬性節點的表示上。

2、DOM 解析過程

如果一個程序需要進行 DOM 解析讀取操作的話,也需要按照如下的步驟進行:

① 建 立 DocumentBuilderFactory : DocumentBuilderFactory factory =

DocumentBuilderFactory.newInstance();

②建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();

③建立 Document : Document doc = builder.parse(“要解析的文件路徑”);

④建立 NodeList : NodeList nl = doc.getElementsByTagName(“讀取節點”);

⑤進行 XML 信息讀取

DOM 操作除了可以進行解析外,也可以進行文檔的生成

如果想要生成 XML 文件,則在創建文檔的時候,就應該使用 newDocument()方法

如果要將 DOM 的文檔輸出,本身是比較麻煩的 。一次編寫多次 copy

public static void createXml() throws Exception{ 
//獲取解析器工廠 
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
//獲取解析器 
DocumentBuilder builder=factory.newDocumentBuilder(); 
//創建文檔 
Document doc=builder.newDocument(); 
//創建元素、設置關係 
Element root=doc.createElement("people"); 
Element person=doc.createElement("person"); 
Element name=doc.createElement("name"); 
Element age=doc.createElement("age"); 
name.appendChild(doc.createTextNode("shsxt")); 
age.appendChild(doc.createTextNode("10")); 
doc.appendChild(root); 
root.appendChild(person); 
person.appendChild(name); 
person.appendChild(age); 
//寫出去 
// 獲得變壓器工廠 
TransformerFactory tsf=TransformerFactory.newInstance(); 
Transformer ts=tsf.newTransformer(); 
//設置編碼
ts.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
//創建帶有DOM節點的新輸入源,充當轉換Source樹的持有者 
DOMSource source=new DOMSource(doc); 
//充當轉換結果的持有者 
File file=new File("src/output.xml"); 
StreamResult result=new StreamResult(file); 
ts.transform(source, result); 
}

二、SAX 解析

SAX(Simple API for XML)解析是按照 xml 文件的順序一步一步的來解析。SAX 沒有官方 的標準機構,它不屬於任何標準阻止或團體,也不屬於任何公司或個人,而是提供任何 人使用的一種計算機技術。

SAX(Simple API for XML,操作 XML 的簡單接口),與 DOM 操作不同的是,SAX 採用的 是一種順序的模式進行訪問,是一種快速讀取 XML 數據的方式。當使用 SAX 解析器進行操作的時候會觸發一系列的事情,當掃描到文檔(document)開始與結束、元素 (element)開始與結束時都會調用相關的處理方法,並由這些操作方法作出相應的操 作,直至整個文檔掃描結束。

如果要想實現這種 SAX 解析,則肯定首先建立一個 SAX 的解析器

// 1、創建解析器工廠 
SAXParserFactory factory = SAXParserFactory.newInstance(); 
// 2、獲得解析器 
SAXParser parser = factory.newSAXParser(); 
// SAX解析器 ,繼承 DefaultHandler 
String path = new File("resource/demo01.xml").getAbsolutePath(); 
// 解析 
parser.parse(path, new MySaxHandler()); 

三、DOM4j 解析

dom4j 是一個簡單的開源庫,用於處理 XML、 XPath 和 XSLT,它基於 Java 平臺,使用 Java 的集合框架,全面集成了 DOM,SAX 和 JAXP。下載路徑:

http://www.dom4j.org/dom4j-1....

http://sourceforge.net/projec...

可以使用 DOM4J 進行 XML 文件的讀、寫操作

DOM4J 與 JDOM 一樣都屬於一個免費的 XML 開源組建,但是由於現在的開發框架中使 用該技術較多,比如 Hibernate、Spring 等都使用 DOM4J 這個功能,所以作爲介紹, 大家可以對該組件有一個瞭解。並沒有誰好誰壞,一般框架使用 DOM4J 較多,而我們平時如果要用則 JDOM 較常見。 可以發現 DOM4J 發揮了很多新特性,比如輸出格式就可以很好解析。

File file = new File("resource/outputdom4j.xml"); 
SAXReader reader = new SAXReader(); 
// 讀取文件作爲文檔 
Document doc = reader.read(file); 
// 獲取文檔的根元素 
Element root = doc.getRootElement(); 
// 根據跟元素找到全部的子節點 
Iterator<Element> iter = root.elementIterator(); 
while(iter.hasNext()){ 
Element name = iter.next(); 
System.out.println("value = " + name.getText()); 
} 

創建

// 使用DocumentHelper來創建 Document對象 
Document document = DocumentHelper.createDocument(); 
// 創建元素並設置關係 
Element person = document.addElement("person"); 
Element name = person.addElement("name"); 
Element age = person.addElement("age"); 
// 設置文本 
name.setText("shsxt"); 
age.setText("10"); 
// 創建格式化輸出器 
OutputFormat of = OutputFormat.createPrettyPrint(); 
of.setEncoding("utf-8"); 
// 輸出到文件 
File file = new File("resource/outputdom4j.xml"); 
XMLWriter writer = new XMLWriter(new FileOutputStream(new 
File(file.getAbsolutePath())),of); 
// 寫出 
writer.write(document); 
writer.flush(); 
writer.close(); 

四、JDOM 解析

下載路徑: http://www.jdom.org/downloads...

JDOM 是一種使用 XML 的獨特 Java 工具包,用於快速開發 XML 應用程序。JDOM 是一個開源項目,它基於樹形結構,利用純 Java 的技術對 XML 文檔實現解析、生成、序列 化及多種操作。

JDOM 解析

掌握 JDOM 開發工具的使用及產生原理

可以使用 JDOM 進行讀取或寫入的操作

在 W3C 本身提供的 XML 操作標準,DOM 和 SAX,但是從開發角度上看,DOM 和 SAX

本身是各有特點的,DOM 可以修改,但不適合讀取大文件,而 SAX 可以讀取大文件,

但是本身不能修改所謂的 JDOM = DOM 的可修改 + SAX 的讀取大文件 。

JDOM 本身是一個免費的開源組建,直接從 http://www.jdom.org 上下載 ,下載後解壓,將 jdom.jar 包拷貝到 Tomcat 目錄(項目)的 lib 中 。

JDOM 主要操作的類:

我們發現 JDOM 的輸出操作要比傳統的 DOM 方便得多,而且也更加直觀,包括在輸出

的時候都很容易了。

此時觀察到的是 JDOM 對於 DOM 解析的支持,但是也說,JDOM 本身也支持了 SAX 的

特點;所以,可以使用 SAX 進行解析操作。

解析

// 獲取SAX解析器 
SAXBuilder builder = new SAXBuilder(); 
File file = new File("resource/demo01.xml"); 
// 獲取文檔 
Document doc = builder.build(new File(file.getAbsolutePath())); 
// 獲取根節點 
Element root = doc.getRootElement(); 
System.out.println(root.getName()); 
// 獲取根節點下所有的子節點, 也可以根據標籤名稱獲取指定的直接點 
List<Element> list = root.getChildren(); 
System.out.println(list.size()); 
for(int x = 0; x<list.size(); x++){ 
Element e = list.get(x); 
// 獲取元素的名稱和裏面的文本 
String name = e.getName(); 
System.out.println(name + "=" + e.getText()); 
System.out.println("==================");
}

創建

// 創建節點 
Element person = new Element("person"); 
Element name = new Element("name"); 
Element age = new Element("age"); 
// 創建屬性 
Attribute id = new Attribute("id","1"); 
// 設置文本 
name.setText("shsxt"); 
age.setText("10"); 
// 設置關係 
Document doc = new Document(person); 
person.addContent(name); 
name.setAttribute(id); 
person.addContent(age); 
XMLOutputter out = new XMLOutputter(); 
File file = new File("resource/outputjdom.xml"); 
out.output(doc, new FileOutputStream(file.getAbsoluteFile()));

關於XML解析先講到這裏了,請繼續關注樂字節,後續Java超級乾貨奉上,快快樂樂學Java。

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