SAX與DOM之間的區(qū)別
SAX (Simple API for XML) 和 DOM (Document Object Model) 是當(dāng)前兩個(gè)主要的XML API,幾乎所有商用的xml 解析器都同時(shí)實(shí)現(xiàn)了這兩個(gè)接口。因此如果你的程序使用了SAX或者DOM APIs,那么你的程序?qū)?/span>xml解析器是透明。
1. DOM以一個(gè)分層的對(duì)象模型來映射xml文檔。而SAX將文檔中的元素轉(zhuǎn)化為對(duì)象來處理。
2. DOM將文檔載入到內(nèi)存中處理,而SAX則相反,它可以檢測一個(gè)即將到來的 XML流,由此并不需要所有的XML代碼同時(shí)載入到內(nèi)存中。
SAX 處理是如何工作的
SAX 在讀取 XML 流的同時(shí)處理它們,這很像以前的自動(dòng)收?qǐng)?bào)機(jī)紙帶(ticker tape)。請(qǐng)考慮下面的 XML 代碼片斷:
<?xml version="1.0"?>
<samples>
<server>UNIX</server>
<monitor>color</monitor>
</samples>
分析這個(gè)代碼片斷的 SAX 處理器一般情況下將產(chǎn)生以下事件:
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 允許開發(fā)人員捕捉這些事件并對(duì)它們作出反應(yīng)。
SAX 處理涉及以下步驟:
1.
2.創(chuàng)建 SAX 解析器。
3.向解析器分配事件處理程序。
4.解析文檔,同時(shí)向事件處理程序發(fā)送每個(gè)事件。
這種處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)。分析能夠立即開始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),
因此不需 要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來說是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)
停止解析。一般來說,SAX 還比它的替代者 DOM 快許多。
另一方面,由于應(yīng)用程序沒有以任何方式存儲(chǔ)數(shù)據(jù),使用 SAX 來更改數(shù)據(jù)或在數(shù)據(jù)流中往后移是不可能的。
另一方面,由于應(yīng)用程序沒有以任何方式存儲(chǔ)數(shù)據(jù),使用 SAX 來更改數(shù)據(jù)或在數(shù)據(jù)流中往后移是不可能的。
DOM 和基于樹的處理
DOM 是處理 XML 數(shù)據(jù)的傳統(tǒng)方法。使用 DOM 時(shí),數(shù)據(jù)以樹狀結(jié)構(gòu)的形式被加載到內(nèi)存中。
例如,在“SAX 處理是如何工作的”中用作例子的相同文檔在 DOM 中將表示為節(jié)點(diǎn),DOM 使用父子關(guān)系。
例如,在“SAX 處理是如何工作的”中用作例子的相同文檔在 DOM 中將表示為節(jié)點(diǎn),DOM 使用父子關(guān)系。
基于樹的處理的優(yōu)點(diǎn)和缺點(diǎn)
DOM
它還可以在任何時(shí)候在樹中上下導(dǎo)航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
另一方面,在內(nèi)存中構(gòu)造這樣的樹涉及大量的開銷。大型文件完全占用系統(tǒng)內(nèi)存容量的情況并不鮮見。此外,創(chuàng)建一棵 DOM 樹可能是一個(gè)緩慢的過程。
另一方面,在內(nèi)存中構(gòu)造這樣的樹涉及大量的開銷。大型文件完全占用系統(tǒng)內(nèi)存容量的情況并不鮮見。此外,創(chuàng)建一棵 DOM 樹可能是一個(gè)緩慢的過程。
1.應(yīng)用程序的目的:如果打算對(duì)數(shù)據(jù)作出更改并將它輸出為 XML,那么在大多數(shù)情況下,DOM 是適當(dāng)?shù)倪x擇。并不是說使用 SAX 就不能更改數(shù)據(jù),
但是該過程要復(fù)雜得多,因?yàn)槟仨殞?duì)數(shù)據(jù)的一份拷貝而不是對(duì)數(shù)據(jù)本身作出更改。
2.數(shù)據(jù)容量: 對(duì)于大型文件,SAX 是更好的選擇。
數(shù)據(jù)將如何使用:如果只有數(shù)據(jù)中的少量部分會(huì)被使用,那么使用 SAX 來將該部分?jǐn)?shù)據(jù)提取到應(yīng)用程序中可能更好。 另一方面,
如果您知道自己以后會(huì)回頭引用已處理過的大量信息,那么 SAX 也許不是恰當(dāng)?shù)倪x擇。
3.對(duì)速度的需要: SAX 實(shí)現(xiàn)通常要比 DOM 實(shí)現(xiàn)更快。
SAX 和 DOM 不是相互排斥的,記住這點(diǎn)很重要。您可以使用 DOM 來創(chuàng)建 SAX 事件流,也可以使用 SAX 來創(chuàng)建 DOM 樹。事實(shí)上,用于創(chuàng)建 DOM 樹的大多數(shù)解析器實(shí)際上都使用 SAX 來完成這個(gè)任務(wù)!
posted on 2009-11-14 13:33 BlakeSu 閱讀(435) 評(píng)論(0) 編輯 收藏