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