DOM解析XML
解析的定義:簡單的說就是提取XML文檔中指定的數據。
我們知道,用Java解析XML文檔,最常用的有兩種方法:
(1)使用基于事件的XML簡單API(Simple API for XML)稱為SAX。
(2)基于樹和節點的文檔對象模型(Document Object Module)稱為DOM。
? ?Sun公司提供了Java API for XML Parsing(JAXP)接口來使用SAX和DOM,通過JAXP,我們可以使用任何與JAXP兼容的XML解析器。對于DOM解析XML文檔來說,實際上是解析DOM形成的DOM樹。
?
? ?DOM為基于開發XML的應用提供了便利,它通過隨機訪問機制,使得應用程序利用該接口可以在任何時候訪問XML文檔中任何一部分數據,也可以對XML文檔中的數據進行插入,刪除,修改,移動等操作,在DOM中文檔的類型類似于一棵樹。文檔,文檔中的根,元素,元素內容,屬性,屬性值等都是以對象模型出現的。DOM的優點在于它在內存組合能夠保存文檔的整個模型,然而,對于大型文檔來說,這樣做可能不方便,因為它可能會用盡內存,或者當系統到達它的極限時,機器的性能會慢下來。
? ? SAX提供了一種對XML文檔進行順序訪問的模式,這是一種快速讀取XML數據的方式,SAX接口是事件驅動,當使用SAX分析器對XML文檔進行分析時,就會觸發一系列事件,并激活相應的事件處理函數,從而完成對XML文檔的訪問,SAX處理XML的方式與DOM不同,SAX解析器不是將DOM樹解析和表現為輸出,他是基于事件的,所以在XML文檔被解析時,事件被發送給引擎。SAX可以在文檔的開始接收事件,也可以接受文檔中的元素,使用這些事件可以構建一種結構。因為SAX沒有把文檔完全的加載到內存中,所以需要的系統資源較少,可以高效分析大型XML文檔,缺點是,SAX編寫比DOM復雜,因為首先實現通知接口并維護狀態,其次SAX不允許對文檔進行隨機訪問,也沒有提供修改功能。
DOM的編程API:
1.節點(Node):Node接口是整個文檔對象模型的主要數據類型,他表示文檔中的單個節點,當實現Node接口的所有對象公開處理子節點的方法時,不是實現Node接口的所有對象的子節點。
2.Document:Document接口表示整個HTML或XML文檔,他是文檔樹的根,并提供對數據的基本訪問,因為文本節點,元素,注釋,處理指令等不能存在于Document的上下文之外,所以Document接口還包含所需的創建這些對象的方法。
3.NodeList:NodeList接口提供對節點的有序集合的抽象,沒有定義和約束如何實現此集合,DOM中的NodeList對象是活動的。
4.NamedNodeMap:NamedNodeMap接口的對象用于表示可以通過名稱訪問的節點的集合,需要注意的是NamedNodeMap不從NodeList繼承,不以任何特定的順序維護NamedNodeMap,在實現NamedNodeMap的對象中包含的對象還可以通過對象索引的方法進行訪問。
5.Element:表示一個程序元素,比如包、類或者方法,每個元素都表示一個靜態的語言初級構造。
DOM解析例子:
對下面的XML文檔進行解析
<?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文檔對應的Document對象 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());}} }
總結
- 上一篇: POJ2352 stars(树状数组)
- 下一篇: 利用找因子来找方程解的个数