XML DOM解析 基礎概念
DOM和SAX
W3C制定了一套書寫XML分析器的標准接口規范——DOM。
除此以外,XML_DEV郵件列表中的成員根據應用的需求也自發地定義了一套對XML文檔進行操作的接口規范——SAX。
這兩種接口規范各有側重,互有長短,應用都比較廣泛。
應用程序開發過程中,應用程序不是直接對XML文檔進行操作的,而是首先由XML分析器對XML文檔進行分析。
然后,應用程序通過XML分析器所提供的DOM接口或SAX接口對分析結果進行操作,從而間接地實現了對XML文檔的訪問。
DOM介紹 優缺點分析
DOM: Document Object Model 文檔對象模型。
在應用程序中,基於DOM的XML分析器將一個XML文檔轉換成一個對象模型的集合(通常稱DOM樹),應用程序通過對這個對象模型的操作,來實現對XML文檔數據的操作。
通過DOM接口,應用程序可以在任何時候訪問XML文檔中的任何一部分數據,因此,這種利用DOM接口的機制也被稱作隨機訪問機制。
DOM樹所提供的隨機訪問方式給應用程序的開發帶來了很大的靈活性,它可以任意地控制整個XML文檔中的內容。
然而,由於DOM分析器把整個XML文檔轉化成DOM樹放在了內存中,因此,當文檔比較大或結構比較復雜時,對內存的需求就比較高。
而且,對於結構復雜的樹的遍歷也是一項耗時的操作。
所以,DOM分析器對機器性能的要求比較高,實現效率不十分理想。
由於DOM分析器所采用的樹結構的思想與XML文檔的結構相吻合,同時鑒於隨機訪問所帶來的方便,因此,DOM分析器還是有很廣泛的應用價值的。
DOM的組成
對於XML應用開發來說,DOM就是一個對象化的XML數據接口,一個與語言無關、與平台無關的標准接口規范。
DOM定義了HTML文檔和XML文檔的邏輯結構,給出了一種訪問和處理這兩種文檔的方法。
文檔代表的是數據,而DOM則代表了如何去處理這些數據。
作為W3C的標准接口規范,目前,DOM由三部分組成,包括:核心(core)、HTML接口和XML接口。
核心部分是結構化文檔比較底層對象的集合,這一部分所定義的對象已經完全可以表達出任何HTML和XML文檔中的數據了。
HTML接口和XML接口兩部分則是專為操作具體HTML文檔和XML文檔所提供的高級接口。
DOM樹
一個XML文檔及其所對應的DOM樹如下:
<?xml version="1.0" encoding="utf-8"?> <bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> </bookstore>
要嚴格區分XML文檔樹中的根節點與根元素節點:
文檔(根節點)和根元素節點是兩回事。
根節點代表整個文檔,是我們解析XML文檔的入口,通過它獲取到Document對象;
根元素節點代表XML文檔的根元素,必須要在獲得Document對象之后才能一層一層地去訪問它的元素。
DOM模型結構
最常見的節點類型:
元素:元素是XML的基本構建。
元素可以有其他元素、文本節點或兩者兼有來作為其子節點。
元素節點還是可以有屬性的唯一類型的節點。
屬性:屬性節點包含關於元素節點的信息,但實際上,不認為它是元素的子節點。
文本:確切來講,文本節點是文本。它可以包含許多信息或僅僅是空白。
文檔(根節點) :文檔節點是整個文檔中所有其他節點的父節點。(根節點不等於根元素節點)。
較不常見的節點類型:CDATA、注釋、處理指令。
DOM的四個基本接口
在DOM接口規范中,有四個基本的接口:Document, Node, NodeList, NamedNodeMap。
Document
Document接口是對文檔進行操作的入口,它是從Node接口繼承過來的。
Node
Node接口是其他大多數接口的父類。
在DOM樹中,Node接口代表了樹中的一個節點。
NodeList
NodeList接口是一個節點的集合,它包含了某個節點中的所有子節點。
它提供了對節點集合的抽象定義,並不包含如何實現這個節點集的定義。
NodeList用於表示有順序關系的一組節點,比如某個節點的子節點序列。
在DOM中,NodeList的對象是live的,對文檔的改變,會直接反映到相關的NodeList對象中。
NamedNodeMap
NamedNodeMap接口也是一個節點的集合,通過該接口,可以建立節點名和節點之間的一一映射關系,從而利用節點名可以直接訪問特定的節點,這個接口主要用在屬性節點的表示上。
盡管NamedNodeMap所包含的節點可以通過索引來進行訪問,但是這只是提供了一種枚舉方法,NamedNodeMap所包含的節點集中節點是無序的。
與NodeList相同,在DOM中,NamedNodeMap對象也是live的。
解析器基礎
XML解析器實際上就是一段代碼,它讀入一個XML文檔並分析其結構。
分類:
帶校驗的解析器。
不帶校驗的解析器。
支持DOM的解析器(W3C的官方標准)
支持SAX的解析器(事實上的工業標准)
參考資料
聖思園張龍老師XML視頻教程。
w3school XML DOM 教程:
http://www.w3school.com.cn/xmldom/index.asp
Java API文檔:
http://docs.oracle.com/javase/7/docs/api/index.html