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