- SAX 與 DOM 的區別

SAX (Simple API for XML)  DOM (Document Object Model) 是當前兩個主要的XML API,幾乎所有商用的xml 解析器都同時實現了這兩個接口。因此如果你的程序使用了SAX或者DOM APIs,那麼你的程序對xml解析器是透明。
1. DOM以一個分層的對象模型來映射xml文檔。而SAX將文檔中的元素轉化爲對象來處理。
2. DOM將文檔載入到內存中處理,而SAX則相反,它可以檢測一個即將到來的 XML流,由此並不需要所有的XML代碼同時載入到內存中。
 
SAX 處理是如何工作的
     SAX 
在讀取 XML 流的同時處理它們,這很像以前的自動收報機紙帶(ticker tape)。請考慮下面的 XML 代碼片斷:
<?xml version="1.0"?>
<samples>
   <server>UNIX</server>
   <monitor>color</monitor>
</samples>
     
分析這個代碼片斷的 SAX 處理器一般情況下將產生以下事件: 
Start document
Start element (samples)
Characters (white space)
Start element (server)
Characters (UNIX)
End element (server)
Characters (white space)
Start element (monitor)
Characters (color)
End element (monitor)
Characters (white space)
End element (samples)
SAX API 
允許開發人員捕捉這些事件並對它們作出反應。
     SAX 
處理涉及以下步驟:
     1.
創建一個事件處理程序。 
     2.
創建 SAX 解析器。 
     3.
向解析器分配事件處理程序。 
     4.
解析文檔,同時向事件處理程序發送每個事件。 
     
基於事件的處理的優點和缺點
     
這種處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,因此不需要將數據存儲在內存中。這對於大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。
另一方面,由於應用程序沒有以任何方式存儲數據,使用 SAX 來更改數據或在數據流中往後移是不可能的。
     DOM 
和基於樹的處理
     DOM 
是處理 XML 數據的傳統方法。使用 DOM 時,數據以樹狀結構的形式被加載到內存中。
     
例如,在“SAX 處理是如何工作的”中用作例子的相同文檔在 DOM 中將表示爲節點,DOM 使用父子關係。
     
基於樹的處理的優點和缺點
     DOM 
以及廣義的基於樹的處理具有幾個優點。首先,由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。它還可以在任何時候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
另一方面,在內存中構造這樣的樹涉及大量的開銷。大型文件完全佔用系統內存容量的情況並不鮮見。此外,創建一棵 DOM 樹可能是一個緩慢的過程。
     
如何在 SAX  DOM 之間選擇
     
選擇 DOM 還是選擇 SAX,這取決於下面幾個因素:
1.
應用程序的目的:如果打算對數據作出更改並將它輸出爲 XML,那麼在大多數情況下,DOM 是適當的選擇。並不是說使用 SAX 就不能更改數據,但是該過程要複雜得多,因爲您必須對數據的一份拷貝而不是對數據本身作出更改。 
2.
數據容量: 對於大型文件,SAX 是更好的選擇。 
數據將如何使用:如果只有數據中的少量部分會被使用,那麼使用 SAX 來將該部分數據提取到應用程序中可能更好。 另一方面,如果您知道自己以後會回頭引用已處理過的大量信息,那麼 SAX 也許不是恰當的選擇。 
3.
對速度的需要: SAX 實現通常要比 DOM 實現更快。 
SAX 
 DOM 不是相互排斥的,記住這點很重要。您可以使用 DOM 來創建 SAX 事件流,也可以使用 SAX 來創建 DOM 樹。事實上,用於創建 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務!

轉自: 作者:Mark.Yin    文章來源:Mark.Yin
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章