傳統的處理xml的api有dom和sax兩種,dom速度慢,占用記憶體極大。sax雖然比dom快,但速度任不理想。現在,一種新的基於流的stream api for xml(簡稱stax)極大地提高了xml的處理速度,並且已經稱為jsr 173標準(目前,stax最好的開源實現是woodstox(它完整地支援staxapi。resin3.1也內建了stax的實現,但是並沒有支援所以的staxapi。xfire在classpath上如果找到了staxapi的定義,就會試圖定位乙個stax的實現。
簡說xml的解析方式(dom,sax,stax)
一般來說,解析xml檔案存在著兩種方式,一種是event-based api,比如說象
這裡,sax和stax的另外一點區別是:sax只能讀xml檔案.stax不但能讀xml檔案,而且還能寫xml檔案.
sax(****** api for xml)
和dom(document object model)
是當前兩個主要的
xml api
,幾乎所有商用的
xml
解析器都同時實現了這兩個介面。因此如果你的程式使用了
sax或者
domapis
,那麼你的程式對
xml解析器是透明。
1.dom
以乙個分層的物件模型來對映
xml文件。而
sax
將文件中的元素轉化為物件來處理。
2.dom
將文件載入到記憶體中處理,而
sax
則相反,它可以檢測乙個即將到來的
xml流,由此並不需要所有的
xml**同時載入到記憶體中。
sax處理是如何工作的
sax在讀取
xml
流的同時處理它們,這很像以前的自動收報機紙帶(
ticker tape
)。請考慮下面的
xml
**片斷:
<?xml version="1.0"?>
unix
color
分析這個**片斷的
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)
saxapi
允許開發人員捕捉這些事件並對它們作出反應。
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來完成這個任務!
SAX 與 DOM 的區別
sax api for xml 和dom document object model 是當前兩個主要的 xml api 幾乎所有商用的 xml 解析器都同時實現了這兩個介面。因此如果你的程式使用了 sax或者 dom apis 那麼你的程式對 xml解析器是透明。1.dom 以乙個分層的物件模型來對...
SAX與DOM解析XML的區別
解析xml有四種方法 dom,sax,dom4j,jdom.我們主要學了兩種 dom和sax.dom適於解析比較簡單的xml而sax則適於解析較複雜的xml檔案。各有各的好。dom和sax的不同 1.dom是基於記憶體的,不管檔案有多大,都會將所有的內容預先裝載到記憶體中。從而消耗很大的記憶體空間。...
SAX與DOM解析XML的區別
解析xml有四種方法 dom,sax,dom4j,jdom.我們主要學了兩種 dom和sax.dom適於解析比較簡單的xml而sax則適於解析較複雜的xml檔案。各有各的好。dom和sax的不同 1.dom是基於記憶體的,不管檔案有多大,都會將所有的內容預先裝載到記憶體中。從而消耗很大的記憶體空間。...