XML解析的兩種方式DOM和SAX

taozihk發表於2016-05-17

DOM和SAX

W3C制定了一套書寫XML分析器的標準介面規範--DOM

除此之外,XML_DEV郵件列表中的成員根據應用的需求也自發地定義了一套對XML文件進行操作的介面規範--SAX。這兩種介面規範各有側重,互有長短,應用都比較廣泛。

 

下面,我們給出DOMSAX在應用程式開發過程中所處地位的示意圖。從圖中可以看出,應用程式不是直接對XML文件進行操作的,而是首先由XML分析器對XML文件進行分析,然後,應用程式通過XML分析器所提供的DOM介面或SAX介面對分析結果進行操作,從而間接地實現了對XML文件的訪問。

DOM

         DOM的全稱是Document Object Model,也即文件物件模型。在應用程式中,基於DOMXML分析器將一個XML文件轉換成一個物件模型的集合(通常稱DOM樹),應用程式正是通過對這個物件模型的操作,來實現對XML文件資料的操作。通過DOM介面,應用程式可以在任何時候訪問XML文件中的任何一部分資料,因此,這種利用DOM介面的機制也被稱作隨機訪問機制。

 

       DOM介面提供了一種通過分層物件模型來訪問XML文件資訊的方式,這些分層物件模型依據XML的文件結構形成了一棵節點樹。無論XML文件中所描述的是什麼型別的資訊,即便是製表資料、專案列表或一個文件,利用DOM所生成的模型都是節點樹的形式。也就是說,DOM強制使用樹模型來訪問XML文件中的資訊。由於XML本質上就是一種分層結構,所以這種描述方法是相當有效的。

 

         DOM樹所提供的隨機訪問方式給應用程式的開發帶來了很大的靈活性,它可以任意的控制整個XML文件中的內容。然而由於DOM分析器把整個XML文件轉化成DOM樹放在記憶體中,因此,當文件比較大或者結構比較複雜時,對記憶體的需求就比較高。而且,對於結構複雜的樹的遍歷也是一項耗時的操作。所以,DOM分析器對機器效能的要求比較高,實現效率不十分理想。不過,由於DOM分析器所採用的樹結構的思想與XML文件的結構相吻合,同時鑑於隨訪訪問所帶來的方便,因此,DOM分析器還是有很廣泛的使用價值的。

 

DOM的四個基本介面

 

文件物件模型利用物件來把文件模型化,這些模型不僅描述了文件的機構,還定義了模型中物件的行為。換句話說,在上面給出的例子裡,圖中的節點不是資料結構,而是物件,物件中包含方法和屬性。在DOM中,物件模型要實現:

Ø 用來表示。操作文件的介面

Ø 介面的行為和屬性

Ø 介面之間的關係以及互操作

 

DOM介面規範中,有四個基本的額介面:DocumentNodeNodeList以及NamedNodeMap。這這四個基本介面中,Document介面是對文件進行操作的入口,它是從Node介面繼承過來的。Node介面是其它大多數介面的父類,像DocumentElementAttributeText,Comment等介面都是從Node介面繼承過來的。NodeList介面是一個節點的集合,通過該介面,可以建立節點和節點之間的一一對映關係,從而利用節點名可以直接訪問特定的節點。

 

  • Document介面

 

Document介面代表了整個XML/HTML文件,因此,它是整棵文件樹的根,提供了對文件中的資料進行訪問和操作的入口。

由於元素。文字節點、註釋、處理指令等都不能脫離文件的上下文關係而獨立存在,所以在Document介面提供了建立其它節點物件的方法,通過該方法建立的節點物件都有一個owenerDocument屬性,用來表明當前節點是由誰所建立的以及節點同Document之間的聯絡。

 

 

Dom樹中,Document介面同其它介面之間的關係如下圖所示:

 

 

  • Node介面

Node介面在整個DOM樹中具有舉足輕重的地位,DOM介面中有很大一部分介面是從Node介面繼承過來的,例如,Element.Attr、等介面,都是從Node繼承過來的,在DOM樹中,Node介面代表了樹中的一個節點。一個典型的Node介面如下圖所示:


 

SAX

 

        SAX的全稱是Simple API for XML,也即XML簡單應用程式介面。與DOM不同,SAX提供的訪問模式是一種順序模式,這是一種快速讀寫XML資料的方式。

當使用SAX分析器對XML文件進行分析時,會觸發一系列事件,並啟用相應的事件處理函式,應用程式通過這些事件處理函式實現對XML文件的訪問,因而SAX介面也被稱作事件驅動介面。

 

        SAX分析器在對XML文件進行分析時,觸發了一系列事件,由於事件觸發本身是有時序性的,因此,SAX提供的是一種順序訪問機制,對於已經分析的部分,不能再倒回去重新處理。SAX之所以被叫做“簡單”應用程式介面,是因為SAX分析器只做了些簡單的工作,大部分工作還要由應用程式自己去做。也就是說,SAX分析器在實現時,它只是順序的檢查XML文件中的位元組流,判斷當位元組是XML語法中哪一部分、是否符合XML語法,然後再觸發相應的事件,而事件處理函式本身則要由應用程式自己來實現,同DOM分析器相比,SAX分析器缺乏靈活性,對於那些只需要訪問XML文件中的資料而不對文件進行更改的應用程式來說,SAX分析器更為合適。

 

 使用DOM解析XML時,首先將xml文件載入到記憶體當中,然後可以通過隨機的方式訪問記憶體中的DOM樹;SAX是基於事件而且是順序執行的,一旦經過了某個元素,我們就沒有辦法再去訪問它了,因此它佔據記憶體要比DOM小,對於大型的xml文件來說,通常會使用SAX而不是DOM進行解析。

相關文章