DOM解析XML
解析的定義:簡(jiǎn)單的說(shuō)就是提取XML文檔中指定的數(shù)據(jù)。
我們知道,用Java解析XML文檔,最常用的有兩種方法:
(1)使用基于事件的XML簡(jiǎn)單API(Simple API for XML)稱為SAX。
(2)基于樹(shù)和節(jié)點(diǎn)的文檔對(duì)象模型(Document Object Module)稱為DOM。
? ?Sun公司提供了Java API for XML Parsing(JAXP)接口來(lái)使用SAX和DOM,通過(guò)JAXP,我們可以使用任何與JAXP兼容的XML解析器。對(duì)于DOM解析XML文檔來(lái)說(shuō),實(shí)際上是解析DOM形成的DOM樹(shù)。
?
? ?DOM為基于開(kāi)發(fā)XML的應(yīng)用提供了便利,它通過(guò)隨機(jī)訪問(wèn)機(jī)制,使得應(yīng)用程序利用該接口可以在任何時(shí)候訪問(wèn)XML文檔中任何一部分?jǐn)?shù)據(jù),也可以對(duì)XML文檔中的數(shù)據(jù)進(jìn)行插入,刪除,修改,移動(dòng)等操作,在DOM中文檔的類型類似于一棵樹(shù)。文檔,文檔中的根,元素,元素內(nèi)容,屬性,屬性值等都是以對(duì)象模型出現(xiàn)的。DOM的優(yōu)點(diǎn)在于它在內(nèi)存組合能夠保存文檔的整個(gè)模型,然而,對(duì)于大型文檔來(lái)說(shuō),這樣做可能不方便,因?yàn)樗赡軙?huì)用盡內(nèi)存,或者當(dāng)系統(tǒng)到達(dá)它的極限時(shí),機(jī)器的性能會(huì)慢下來(lái)。
? ? SAX提供了一種對(duì)XML文檔進(jìn)行順序訪問(wèn)的模式,這是一種快速讀取XML數(shù)據(jù)的方式,SAX接口是事件驅(qū)動(dòng),當(dāng)使用SAX分析器對(duì)XML文檔進(jìn)行分析時(shí),就會(huì)觸發(fā)一系列事件,并激活相應(yīng)的事件處理函數(shù),從而完成對(duì)XML文檔的訪問(wèn),SAX處理XML的方式與DOM不同,SAX解析器不是將DOM樹(shù)解析和表現(xiàn)為輸出,他是基于事件的,所以在XML文檔被解析時(shí),事件被發(fā)送給引擎。SAX可以在文檔的開(kāi)始接收事件,也可以接受文檔中的元素,使用這些事件可以構(gòu)建一種結(jié)構(gòu)。因?yàn)镾AX沒(méi)有把文檔完全的加載到內(nèi)存中,所以需要的系統(tǒng)資源較少,可以高效分析大型XML文檔,缺點(diǎn)是,SAX編寫(xiě)比DOM復(fù)雜,因?yàn)槭紫葘?shí)現(xiàn)通知接口并維護(hù)狀態(tài),其次SAX不允許對(duì)文檔進(jìn)行隨機(jī)訪問(wèn),也沒(méi)有提供修改功能。
DOM的編程API:
1.節(jié)點(diǎn)(Node):Node接口是整個(gè)文檔對(duì)象模型的主要數(shù)據(jù)類型,他表示文檔中的單個(gè)節(jié)點(diǎn),當(dāng)實(shí)現(xiàn)Node接口的所有對(duì)象公開(kāi)處理子節(jié)點(diǎn)的方法時(shí),不是實(shí)現(xiàn)Node接口的所有對(duì)象的子節(jié)點(diǎn)。
2.Document:Document接口表示整個(gè)HTML或XML文檔,他是文檔樹(shù)的根,并提供對(duì)數(shù)據(jù)的基本訪問(wèn),因?yàn)槲谋竟?jié)點(diǎn),元素,注釋,處理指令等不能存在于Document的上下文之外,所以Document接口還包含所需的創(chuàng)建這些對(duì)象的方法。
3.NodeList:NodeList接口提供對(duì)節(jié)點(diǎn)的有序集合的抽象,沒(méi)有定義和約束如何實(shí)現(xiàn)此集合,DOM中的NodeList對(duì)象是活動(dòng)的。
4.NamedNodeMap:NamedNodeMap接口的對(duì)象用于表示可以通過(guò)名稱訪問(wèn)的節(jié)點(diǎn)的集合,需要注意的是NamedNodeMap不從NodeList繼承,不以任何特定的順序維護(hù)NamedNodeMap,在實(shí)現(xiàn)NamedNodeMap的對(duì)象中包含的對(duì)象還可以通過(guò)對(duì)象索引的方法進(jìn)行訪問(wèn)。
5.Element:表示一個(gè)程序元素,比如包、類或者方法,每個(gè)元素都表示一個(gè)靜態(tài)的語(yǔ)言初級(jí)構(gòu)造。
DOM解析例子:
對(duì)下面的XML文檔進(jìn)行解析
<?xml version="1.0" encoding="GBK"?> <addresslist><linkman><name>Jack</name><id>10011</id><school>NEFU</school><tel>454655465</tel><mybook>DOM解析</mybook></linkman> </addresslist>那么利用Java解析代碼如下
import org.w3c.dom.*; import javax.xml.parsers.*; import java.io.*;public class DOM{public static void main(String[] args) throws Exception{//獲取DOM解析的工廠DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //獲取解析器 DocumentBuilder builder = factory.newDocumentBuilder(); //把XML文檔輸入到解析器中,并獲取XML文檔對(duì)應(yīng)的Document對(duì)象 Document doc = builder.parse(new File("src//DOM.xml")); NodeList list = doc.getElementsByTagName("linkman");for(int i=0;i<list.getLength();i++){Element e = (Element)list.item(i);System.out.println(e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());System.out.println(e.getElementsByTagName("id").item(0).getFirstChild().getNodeValue());System.out.println(e.getElementsByTagName("school").item(0).getFirstChild().getNodeValue());System.out.println(e.getElementsByTagName("tel").item(0).getFirstChild().getNodeValue());System.out.println(e.getElementsByTagName("mybook").item(0).getFirstChild().getNodeValue());}} }
總結(jié)
- 上一篇: POJ2352 stars(树状数组)
- 下一篇: asp.net ajax控件工具集 Au