在解析xml時(如瀏覽器解析html標簽),主要存在兩種方式:SAX模式和DOM模式
SAX (Simple API for XML) 和 DOM (Document Object Model) 是當前兩個主要的XML API,幾乎所有商用的xml 解析器都同時實現了這兩個接口。因此如果你的程序使用了SAX或者DOM APIs,那么你的程序對xml解析器是透明。
SAX | DOM |
依序讀入文件並產生相對應事件,可以處理任何大小的XML文件。 | 在內存中建立文件樹,不適於處理大型的XML文件。 |
只能對文件按順序剖析一遍,不支持對文件的隨意存取 | 可以隨意存取文件樹的任何部分,沒有次數限制 |
只能讀取XML文件內容,而不能修改 | 可以隨意修改文件樹,從而修改了XML文件 |
開發上比較復雜,需要自己來制作事件處理器 | 易於理解,易於開發 |
對工作人員更靈活,可以用SAX建立自己的XML對象模型 | 已經在DOM基礎之上建立了文件樹 |
基於事件的處理的優點和缺點
這種處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,
DOM
以及廣義的基於樹的處理具有幾個優點。首先,由於樹在內存中是持久的,因此可以修改它以便應用程序能對數據和結構作出更改。
如何在 SAX 和 DOM 之間選擇
選擇 DOM 還是選擇 SAX,這取決於下面幾個因素:
1. 應用程序的目的:如果打算對數據作出更改並將它輸出為 XML ,那么在大多數情況下, DOM 是適當的選擇。並不是說使用 SAX 就不能更改數據,
2. 數據容量: 對於大型文件, SAX 是更好的選擇。
數據將如何使用:如果只有數據中的少量部分會被使用,那么使用 SAX 來將該部分數據提取到應用程序中可能更好。 另一方面,
3. 對速度的需要: SAX 實現通常要比 DOM 實現更快。
SAX 和 DOM 不是相互排斥的,記住這點很重要。您可以使用 DOM 來創建 SAX 事件流,也可以使用 SAX 來創建 DOM 樹。事實上,用於創建 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務!
這種處理的優點非常類似於流媒體的優點。分析能夠立即開始,而不是等待所有的數據被處理。而且,由於應用程序只是在讀取數據時檢查數據,
因此不需 要將數據存儲在內存中。這對於大型文檔來說是個巨大的優點。事實上,應用程序甚至不必解析整個文檔;它可以在某個條件得到滿足時
停止解析。一般來說,
SAX
還比它的替代者
DOM
快許多。
另一方面,由於應用程序沒有以任何方式存儲數據,使用 SAX 來更改數據或在數據流中往后移是不可能的。
另一方面,由於應用程序沒有以任何方式存儲數據,使用 SAX 來更改數據或在數據流中往后移是不可能的。
基於樹的處理的優點和缺點
DOM
它還可以在任何時候在樹中上下導航,而不是像
SAX
那樣是一次性的處理。
DOM
使用起來也要簡單得多。
另一方面,在內存中構造這樣的樹涉及大量的開銷。大型文件完全占用系統內存容量的情況並不鮮見。此外,創建一棵 DOM 樹可能是一個緩慢的過程。
另一方面,在內存中構造這樣的樹涉及大量的開銷。大型文件完全占用系統內存容量的情況並不鮮見。此外,創建一棵 DOM 樹可能是一個緩慢的過程。
1. 應用程序的目的:如果打算對數據作出更改並將它輸出為 XML ,那么在大多數情況下, DOM 是適當的選擇。並不是說使用 SAX 就不能更改數據,
但是該過程要復雜得多,因為您必須對數據的一份拷貝而不是對數據本身作出更改。
2. 數據容量: 對於大型文件, SAX 是更好的選擇。
數據將如何使用:如果只有數據中的少量部分會被使用,那么使用 SAX 來將該部分數據提取到應用程序中可能更好。 另一方面,
如果您知道自己以后會回頭引用已處理過的大量信息,那么
SAX
也許不是恰當的選擇。
3. 對速度的需要: SAX 實現通常要比 DOM 實現更快。
SAX 和 DOM 不是相互排斥的,記住這點很重要。您可以使用 DOM 來創建 SAX 事件流,也可以使用 SAX 來創建 DOM 樹。事實上,用於創建 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務!