曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
處理指令來創建數據結構。這些“交易對象”可能只是和X M L文件內容有一點關系;例如它們
可能只是組合X M L文件和其他數據源的數據。在這種情況下,如果想在內存中創建面向應用的
數據結構,首先創建一個低級D O M結構然后毀壞它是很不合算的。可以僅在每個事件發生時處
理它,這樣保證商務對象模型合理地增加變動。
(3) 適合小信息子集
如果僅對計算本周圖書館購進的書籍數量或確定它們的平均價s格感興趣,那么把不需要的
全部數據和需要的少量數據一起讀入內存是非常低效和不必要的。SAX 一個非常好的特點就是
可以非常容易地忽略不感興趣的數據信息。
(4) 簡單
如題所示, S A X非常易于使用。
(5) 快速
如果可以從經由文檔的簡單序列中獲取你需要的信息, S A X幾乎一定是最快的方法。
2. SAX的缺點
在論述完其優點之后應該指出使用S A X時可能遇到的不足之處。
(1) 不能對文檔做隨機存取
因為文檔并不加載到內存,所以必須按照數據提交的次序進行處理。對于文檔中包含許多
內部交叉引用如使用I D和I D R E F屬性的情況,S A X使用起來會困難一些。
(2) 難以實現復雜的查詢
復雜的查詢對程序而言是非常凌亂的,因為必須自己維護含有你所需要保留信息的數據結
構,如當前元素祖先的屬性。
(3) 不能使用文檔類型定義( D T D)
S A X 1 . 0不會告知D T D的任何內容。實際上D O M也不會告知太多內容什么,盡管有些提供商
已經擴展了D O M接口以支持這種功能。這對大多數應用程序來說并不是個問題: D T D主要是解
析器感興趣的問題;而且在本章末尾可以看到這個問題在SAX 2.0中得到了解決。
(4) 不可獲取詞法信息
S A X的設計原理是它不提供詞法信息。S A X設法告知文檔作者想要說明什么,而不是讓你
忙于研究他們說明方式的細節。例如:
第6章SAX 1.0: XML簡易API使用147 下載
• 你不能查明原始文檔中是否包含“& # x a ; ”或“& # 1 0 或; ”它是否包含一個換行字符:所有這
三種情況以相同的方式報告給應用程序。
• 你不會被告知文檔中的注釋說明: S A X假設注釋是為方便作者而不是讀者設計的。
• 你不會得知屬性書寫的順序:這被認為是無關緊要的。
只有當你考慮到以后可能會需要編輯文檔,想按照文檔原先書寫的方式重新創建它時,這
些限制才會導致一些問題。例如你需要編寫這樣一個應用程序,它用來在完整無缺地保留文檔
原有內容的基礎上,從另外一個文檔添加某些額外信息到原文檔中。這樣如果你隨意改變了屬
性的順序或丟棄了所有的注釋,原文檔作者會不滿意的。實際上,大多數限制和D O M是一樣的,
盡管D O M的確在某些方面提供了稍多一些的信息:例如它保留了注釋。此外,很多這樣的限制
在SAX 2.0里得到改進;盡管沒有完全解決,例如屬性的順序和分割符(單引號或雙引號)的選
取一樣仍然是個難題。
(5) SAX是只讀的
D O M可以從X M L原文件中讀取文檔,也可以創建和修改內存中的文檔。相比較而言, S A X
是用來讀取X M L文檔而不是書寫文檔。
實際結果是S A X接口可以很容易地和讀取X M L文檔一樣書寫文檔。稍后可以看到,解析器
讀取X M L文檔時發送給應用程序的事件流同樣可以被應用程序發送到文檔生成器以創建文檔。
(6) 當前的瀏覽器不支持S A X
盡管有許多支持S A X接口的X M L解析器。在編寫本書時還沒有一個主流的We b瀏覽器內置
X M L解析器以支持S A X接口。你當然可以把兼容S A X的解析器合成到一個Java applet程序中去,
但是從服務器下載a p p l e t的開銷會使低速接入Internet 的用戶失去耐心。實際上客戶端X M L編程
可選擇的接口是相當有限的。
6.2 SAX的由來
較少文檔提及S A X的歷史,因為所有討論是通過X M L - D E V公共郵件列表實現的,郵件列表
的文本可以從h t t p : / / w w w. l i s t . i c . a c . u k / h y p e r m a i l / x m l - d e v /獲取。David Megginson 也在
h t t p : / / w w w. m e g g i n s o n . c o m / S A X / h i s t o r y. h t m l中概述了S A X的歷史。
整個過程始于1 9 9 7年底,作為像Peter Murray-Rust這樣一些開發X M L應用程序并致力于解
決不同解析器間不能無縫兼容問題的X M L用戶施加壓力的結果。早期X M L解析器的提供者,包
括Tim Bray, David Megginson和James Clark對討論也做出了貢獻,許多其他郵件列表成員對不同
的草稿也提出一些見解。David Megginson發明了一種討論方法,當然是依照I n t e r n e t初始的“征
求意見稿”精神,由此意見和建議可以被迅速而公平地處理,最后他于1 9 9 8年5月11日發布了規
范終稿。
S A X成功的一個主要原因是初始的規范, M e g g i n s o n為許多流行的X M L解析器—包括他自
己的AEl f r e d , Tim Bray的L a r k和M i c r o s o f t的M S X M L提供了前端驅動。一旦S A X以這種方式建立,
其他解析器提供商如I B M , S u n和O r a c l e很快在它們的解析器中集成了最早的S A X接口,這樣它們
的產品就可以和現有的應用程序一起運行。
最終的S A X規范是根據J a v a接口書寫的。它已經被改寫成其他語言,盡管我們只知道用
148使用XML 高級編程
下載
P y t h o n語言編寫的接口得到積極支持, P y t h o n是Lars Marius Garshol 創立的( 參見
h t t p : / / w w w.stud.ifi.uio.no/~larsga/download/python/xml/saxlib.html )。當然, J a v a接口可以在其
他可以和J a v a交互操作的語言中使用,例如通過使用M i c r o s o f t的J a v a虛擬機提供的從J a v a到C O M
的接口。不過在本章里將只使用初始的J a v a。
S A X的結構
S A X是由許多Java 接口構建而成的。了解接口和類之間的區別是很重要的:
• 接口表示它們是什么方法和它們需要的參數種類。接口完全是一個規范;當方法被調用時
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(57)