XML解析的兩種方式DOM和SAX
DOM和SAX
W3C制定了一套書寫XML分析器的標準介面規範--DOM。
除此之外,XML_DEV郵件列表中的成員根據應用的需求也自發地定義了一套對XML文件進行操作的介面規範--SAX。這兩種介面規範各有側重,互有長短,應用都比較廣泛。
下面,我們給出DOM和SAX在應用程式開發過程中所處地位的示意圖。從圖中可以看出,應用程式不是直接對XML文件進行操作的,而是首先由XML分析器對XML文件進行分析,然後,應用程式通過XML分析器所提供的DOM介面或SAX介面對分析結果進行操作,從而間接地實現了對XML文件的訪問。
DOM
DOM的全稱是Document Object Model,也即文件物件模型。在應用程式中,基於DOM的XML分析器將一個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介面規範中,有四個基本的額介面:Document,Node,NodeList以及NamedNodeMap。這這四個基本介面中,Document介面是對文件進行操作的入口,它是從Node介面繼承過來的。Node介面是其它大多數介面的父類,像Document,Element,Attribute,Text,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進行解析。
相關文章
- XML解析-最快的方式SAXXML
- 四種操作xml的方式: SAX, DOM, JDOM , DOM4J的比較XML
- DOM解析和SAX解析
- Android系列--DOM、SAX、Pull解析XMLAndroidXML
- dom解析和sax解析的區別
- python 解析xml 檔案: SAX方式PythonXML
- Java解析XML彙總(DOM/SAX/JDOM/DOM4j/XPath)JavaXML
- XML的四種解析器(dom_sax_jdom_dom4j)原理及效能比較[收藏]XML
- java中四種操作(DOM、SAX、JDOM、DOM4J)xml方式詳解與比較JavaXML
- java使用sax解析xmlJavaXML
- 解析xml的幾種方式XML
- [轉]使用 SAX 處理 XML 文件 和與DOM的區別XML
- 使用JAXP進行DOM解析_SAX解析
- python 解析xml 檔案: DOM 方式PythonXML
- :Android網路程式設計--XML之解析方式:SAXAndroid程式設計XML
- python使用SAX解析xmlPythonXML
- DOM解析XMLXML
- Java DOM4J 方式解析XML檔案JavaXML
- xml解析之domXML
- 四種XML解析方式詳解XML
- ABAP和XML資料格式互相轉換的兩種方式XML
- JAVA-使用SAX解析XML資料JavaXML
- Python解析xml大檔案(sax)PythonXML
- 關於SAX解析xml檔案的問題XML
- Python解析xml[xml.dom]PythonXML
- 用Java結合SAX 2.0 解析XML文件 (轉)JavaXML
- Python XML解析之DOMPythonXML
- XML DOM 解析器概述XML
- dom4j解析xmlXML
- Java中Dom解析xml文件JavaXML
- XML 檔案解析實踐 (DOM 解析)XML
- 兩種include方式及filter中的dispatcher解析Filter
- 使用jaxp解析器dom方式對xml節點進行操作XML
- 基於 DOM 的 XML 檔案解析類XML
- JAVA與DOM解析器提高(DOM/SAX/JDOM/DOM4j/XPath) 學習筆記二Java筆記
- MyBatis 與 SpringBoot 整合:註解和xml兩種使用方式介紹MyBatisSpring BootXML
- 橫向對比分析Python解析XML的4種方式PythonXML
- XML DOM 解析器錯誤概述XML