掌握SAX
發(fā)表時間:2024-02-05 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在用DOM耗費(fèi)較長時間解析XML文件以后,你可能注意到在用DOM處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的:這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存。在采用DOM之后性能受到嚴(yán)重影響的情況下,你不妨考慮使用Simple API for XM...
在用DOM耗費(fèi)較長時間解析XML文件以后,你可能注意到在用DOM處理大型文件時其性能下降的非常厲害。這個問題是由DOM的樹結(jié)構(gòu)所造成的:這種結(jié)構(gòu)占用的內(nèi)存較多,而且DOM必須在解析文件之前把整個文檔裝入內(nèi)存。在采用DOM之后性能受到嚴(yán)重影響的情況下,你不妨考慮使用Simple API for XML(SAX)。在這篇文章中,我們就為你介紹SAX API,同時提出若干采用不同語言實(shí)現(xiàn)的SAX鏈接。
SAX最初是由David Megginson采用Java語言開發(fā)的,之后SAX很快在Java開發(fā)者中流行起來。SAN項目現(xiàn)在負(fù)責(zé)管理其原始API的開發(fā)工作,這是一種公開的、開放源代碼軟件。不同于其他大多數(shù)XML標(biāo)準(zhǔn)的是,SAX沒有語言開發(fā)商必須遵守的標(biāo)準(zhǔn)SAX參考版本。因此,SAX的不同實(shí)現(xiàn)可能采用區(qū)別很大的接口。不過,所有的這些實(shí)現(xiàn)至少有一個特性是完全一樣的,這就是事件驅(qū)動。
事件驅(qū)動的文檔解析
在SAX解析器裝載XML文件時,它遍歷文件文檔并在其主機(jī)應(yīng)用程序中產(chǎn)生事件(經(jīng)由回調(diào)函數(shù)、指派函數(shù)或者任何可調(diào)用平臺完成這一功能)表示這一過程。這樣,編寫SAX應(yīng)用程序就如同采用最現(xiàn)代的工具箱編寫GUI程序。
大多數(shù)SAX實(shí)現(xiàn)都會產(chǎn)生以下若干類型的事件:
在文檔的開始和結(jié)束時觸發(fā)文檔處理事件。
在文檔內(nèi)每一XML元素接受解析的前后觸發(fā)元素事件。任何元數(shù)據(jù)通常都由單獨(dú)的事件交付。
在處理文檔的DTD或Schema時產(chǎn)生DTD或Schema事件。
錯誤事件用來通知主機(jī)應(yīng)用程序解析錯誤。
顯而易見,在處理文檔時你最關(guān)心的就是元素事件了。通常,SAX解析器會向你的主機(jī)應(yīng)用程序提供包含元素信息的事件參數(shù);在最低程度下也會提供元素的名字。具體取決于你的特定實(shí)現(xiàn),可以定義不同類型的元素事件代表不同類型元素的處理。例如,注釋元素(它可能包含主機(jī)應(yīng)用程序的處理指令)就經(jīng)常在接受處理時產(chǎn)生特殊的事件。
下面我們就舉個比較基本的例子。假如你把程序清單A中的XML文件裝入了SAX解析器,那么你可能會在你的主機(jī)應(yīng)用程序中收到以下事件通知:
Document Start
Element Start "catalog"
Element Start "book"
Element Start "author"
Data "Adams, Lamont"
Element End "author"
Element Start "title"
Data "Lamont’s First Book"
Element End "title"
Element End "book"
Element End "catalog"
Document End
SAX對DOM
在什么情況下采用這種或者那種API并沒有確定的嚴(yán)格規(guī)則;具體情況具體分析。所有的SAX處理都在一次遍歷中完成的;因此,在解析同等大小的文檔時SAX通常會相比DOM提供更好的性能(因為DOM必須遍歷樹結(jié)構(gòu))。此外,與DOM是比,因為在給定的時間之內(nèi)只需要XML文檔的一部分裝入內(nèi)存,所以SAX 通常在處理更大文件時內(nèi)存的利用效率也來得更高(我已經(jīng)提到過,DOM在開始解析文檔之前必須把全部XML文檔裝入內(nèi)存)。
然而,SAX也不是沒有缺點(diǎn)。SAX應(yīng)用程序一般都比較長,程序中充斥著大量的if/else結(jié)構(gòu)用來確定處理特定元素時所采用的運(yùn)動。同樣的,處理多個XML元素之間散布的數(shù)據(jù)結(jié)構(gòu)也很成問題,因為解析事件之間必須保存中間數(shù)據(jù)。最后, SAX應(yīng)用程序的事件處理結(jié)構(gòu)一般意味著SAX應(yīng)用程序是針對特定文件結(jié)構(gòu)定制構(gòu)建的,而DOM應(yīng)用程序則更具一般性。
從哪里獲得SAX
相當(dāng)多的SAX實(shí)現(xiàn)都可以從網(wǎng)上獲得。不幸的是,它們之間稍有不同,但其大多數(shù)都提供了相應(yīng)的幫助文檔。以下是一些流行的SAX實(shí)現(xiàn):
當(dāng)然,最“標(biāo)準(zhǔn)”的Java版本在SAX項目網(wǎng)站。
Microsoft XML Core Services 4.0 庫包括了采用COM的SAX解析器,對VB程序員特別有用(或開發(fā)Windows的程序員)。
支持Perl的binding of SAX 2.0。
SAX in C++ 是一套用在SAX和C++應(yīng)用程序中的C++接口和封裝類。
許多編程語言,比如Python和所有的.NET語言都在其核心功能中內(nèi)建支持SAX。