SAX是Simple API for XML的縮寫,它并不是由W3C官方所提出的標(biāo)準(zhǔn),可以說是“民間”的事實(shí)標(biāo)準(zhǔn)。實(shí)際上,它是一種社區(qū)性質(zhì)的討論產(chǎn)物。雖然如此,在XML中對SAX的應(yīng)用絲毫不比DOM少,幾乎所有的XML解析器都會支持它。
與DOM比較而言,SAX是一種輕量型的方法。我們知道,在處理DOM的時(shí)候,我們需要讀入整個的XML文檔,然后在內(nèi)存中創(chuàng)建DOM樹,生成DOM樹上的每個Node對象。當(dāng)文檔比較小的時(shí)候,這不會造成什么問題,但是一旦文檔大起來,處理DOM就會變得相當(dāng)費(fèi)時(shí)費(fèi)力。特別是其對于內(nèi)存的需求,也將是成倍的增長,以至于在某些應(yīng)用中使用DOM是一件很不劃算的事(比如在applet中)。這時(shí)候,一個較好的替代解決方法就是SAX。
SAX在概念上與DOM完全不同。首先,不同于DOM的文檔驅(qū)動,它是事件驅(qū)動的,也就是說,它并不需要讀入整個文檔,而文檔的讀入過程也就是SAX的解析過程。所謂事件驅(qū)動,是指一種基于回調(diào)(callback)機(jī)制的程序運(yùn)行方法。(如果你對Java新的代理事件模型比較清楚的話,就會很容易理解這種機(jī)制了)
在XMLReader接受XML文檔,在讀入XML文檔的過程中就進(jìn)行解析,也就是說讀入文檔的過程和解析的過程是同時(shí)進(jìn)行的,這和DOM區(qū)別很大。解析開始之前,需要向XMLReader注冊一個ContentHandler,也就是相當(dāng)于一個事件監(jiān)聽器,在ContentHandler中定義了很多方法,比如startDocument(),它定制了當(dāng)在解析過程中,遇到文檔開始時(shí)應(yīng)該處理的事情。當(dāng)XMLReader讀到合適的內(nèi)容,就會拋出相應(yīng)的事件,并把這個事件的處理權(quán)代理給ContentHandler,調(diào)用其相應(yīng)的方法進(jìn)行響應(yīng)。
Author: orangelizq
email: orangelizq@163.com
|
|
歡迎大家訪問我的個人網(wǎng)站 萌萌的IT人