曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
載到內存中而造成的開銷,可以使用S A X等事件驅動的解析器處理大型X M L文件,我們將在下
一章介紹S A X。
144使用XML 高級編程
下載
下載
第6章SAX 1.0:XML簡易API
在第5章里考慮了如何使用文檔對象模型( D O M )編寫應用程序。本章將著眼于處理X M L文檔
的另一種方式: S A X接口。我們先論述一下為什么要選擇使用S A X接口而不是文檔對象模型,
然后通過編寫一些簡單的應用程序來探究S A X接口技術。本章也將討論一些設計模式,它們在
創建更復雜的S A X應用程序時會有所幫助。最后本章描述了S A X未來的發展前景。
S A X的接口風格完全不同于文檔對象模型。文檔對象模型應用程序通過遵循內存中的對象
參照來要求文檔中的內容;使用S A X ,解析器通過向應用程序報告解析事件流來告知應用程序文
檔的內容。
S A X即X M L簡易應用程序編程接口,全稱是擴展標記語言簡易應用程序編程接口。
從名稱上可以看出, S A X接口可以用來編寫應用程序以讀取X M L文檔中存有的數據。S A X
在本質上是一種J a v a接口,本章所有給出的例子也是用J a v a編寫的。(因為本章沒有足夠的篇幅
講解J a v a 技術,為此我們假設讀者已具有了J a v a 的相關知識。參見Wr o x 出版社出版的
《Beginning Java2 》,ISBN 1861002238 ;也可以在h t t p : / / w w w. j a v a . s u n . c o m查找到更多的信
息。)
S A X接口事實上被所有的Java XML 解析器支持,而且兼容性非常好。參看h t t p : / / w w w.
x m l s o f t w a r e . c o m或David Megginson的站點h t t p : / / w w w. m e g g i n s o n . c o m / S A X /列出的一些實例。
在用J a v a編寫S A X應用程序前,你需要安裝S A X類(當然要先安裝Java JDK)。大多數情況
下你會發現X M L解析器自動幫你安裝了S A X類(稍后我們將告知如何快捷地獲取這些解析器)。
檢查在你的類路徑中是否包含如o rg . x m l . s a x . P a r s e r 的類, 如果沒有, 你可以從
h t t p : / / w w w. m e g g i n s o n . c o m / S A X /安裝這些類。我們隨后將介紹一下關于S A X的起源與發展趨勢。
但是現在我們將僅提及它最顯著的一個特性: S A X不屬于任何標準組織或團體,也不屬于任何
公司或個人;它是供任何人實現與使用的一種計算機技術。尤其與大多數X M L標準族的不同之
處在于,S A X和W 3 C組織沒有任何關系。
S A X的開發工作由David Megginson負責協調, S A X的規范可在David Megginson的站點查找
(h t t p : / / w w w. m e g g i n s o n . c o m / S A X/。這個規范中有些不重要的編輯方面的修改,對本書附錄C中
的相關約定進行了再版。
6.1 事件驅動接口
從程序中讀取X M L文檔基本上有三種方式:
• 把X M L只當做一個文件讀取,然后自己挑選出其中的標簽。這是黑客們的方法,我們不推
薦這種方式。你很快會發現處理所有的特殊情況(包括不同的字符編碼,例外約定,內部
和外部實體,缺省屬性等)比想象的困難得多;你可能不能夠正確地處理所有的特殊情況,
這樣你的程序會接收到一個非常規范的X M L文檔,卻不能正確地處理它。要避免這種想法:
X M L解析器似乎并不昂貴(大多數是免費的)。
• 可以用解析器分析文檔并在內存里創建對文檔內容樹狀的表達方式:解析器將輸出傳遞給
文檔對象模型,即D O M。這樣程序可以從樹的頂部開始遍歷,按照從一個樹單元到另一
個單元的引用,從而找到需要的信息。
• 也可以用解析器讀取文檔,當解析器發現標簽時告知程序它發現的標簽。例如它會告知它
何時發現了一個開始標簽,何時發現了一些特征數據,以及何時發現了一個結束標簽。這
叫做事件驅動接口,因為解析器告知應用程序它遇到的有含義的事件。如果這正是你需要
的那種接口,可以使用S A X。
讓我們更加詳細地看一下事件驅動解析過程。
你可能已經在用戶接口編程中遇到過“事件驅動”這個術語,用來編寫應用程序以響應發
生的如鼠標點擊等事件。事件驅動解析器和其類似:特別是你必須習慣于應用程序不是你所控
制這一概念。一旦事情要開始發生,你不需要調用解析器,而是解析器調用程序。開始看起來
有些奇怪,但是一旦你習慣了,這就不是個問題。實際上,它比用戶接口編程更容易,因為不
需要忙于處理隨時發生的鼠標事件, X M L要解析的事件按照相對可預見的順序出現。X M L元素
必須完全成對出現,所以你可以知道每個已經打開的元素隨后肯定會被關閉。
下面是一個簡單的X M L文件:
程序清單6 - 1
當解析器進行處理時,它會調用一連串方法,如下所示(我們將在后面描述實際的方法命名與參
數,這里僅為例證說明):
程序清單6 - 2
你的應用程序提供當s t a r t E l e m e n t和e n d E l e m e n t等事件發生時需要調用的方法。
為什么使用事件驅動接口
假如可以選擇的話,那么知道什么情況下使用S A X這樣的事件驅動接口最好,或者在什么時
候使用D O M這樣基于樹結構的接口更好一些是很重要的。
這兩種接口都已經很好地標準化并得到廣泛的支持,因此不管使用哪一種接口,都有很多
性能良好的解析器可供選擇,而且大部分是免費的。實際上很多解析器同時支持兩種接口。
146使用XML 高級編程
下載
1. SAX的優點
下面的部分簡述了S A X接口最顯著的一些優點。
(1) 可以解析任意大小的文件
因為S A X不需要把整個文件加載到內存,所以對內存的占用一般比D O M小得多,而且不隨
著文件大小的增加而增加。當然D O M使用的實際內存數量要視解析器而定,但在大多數情況下
一個1 0 0 K b的文檔至少要占用1 M b的內存。
但是有一點要注意:如果S A X應用程序自身在內存中創建文檔的表達,它會占用和允許
解析器創建空間一樣大小的內存。
(2) 適合創建自己的數據結構
應用程序可能會想用如書、作者以及出版者這樣的高級對象而不是一些低級元素、屬性和
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(56)