曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
• 當使用多版本系統,同一實體具有多個版本,以及決定在給定情形使用哪個版本的規則。
• 當存在一系列標準實體的許多副本,而且系統考慮性能因素,想找到最近的副本。
• 當實體被公共標識符而不是U R L引用時。公共標識在S G M L領域越來越流行而且許多出
版商也希望能夠繼續通過X M L使用它們。在S G M L中,公共標識符一般通過被稱為目錄的
查找表映射到實際文件。X M L中沒有定義這樣的機制,但是S A X允許應用程序使用這種
機制。
當外部實體不能僅僅通過U R L 被找到, S A X 應用程序應該提供一個實體分解器
(E n t i t y R e s o l v e r):即一個實現o rg . x m l . s a x . E n t i t y R e s o l v e r接口的類。應用程序可以通過調用解析
器的s e t E n t i t y R e s o l v e r ( )方法來為解析器注冊實體分解器。
實體分解器只需要實現一個方法: resolveEntity( )。它被解析器通過兩個參數調用:系統標
識符(即U R L)和公共標識符。如果在實體聲明中沒有指定公共標識符,公共標識符設為空值。
resolveEntity( )方法的任務是返回一個I n p u t S o u r c e對象,解析器將使用這個對象讀取外部實體的
內容。
在附錄C SAX規范中有一個實體分解器的簡單實例。
非解析實體與注釋
S A X一般來說不會提供給應用程序任何關于D T D內容的信息。在S A X定義過程中,人們認
為絕大多數應用程序都不需要這類信息,因此它被擱置了。(我們將看到S A X 2 . 0在這方面擴展一
些可用功能。)
然而,完全禁止對D T D內容的訪問將使S A X應用程序不能處理一些文檔,這些文檔包含對
非解析實體與注釋的引用。果真這樣的話,有一些很少使用但不能斷言如此的X M L特性,它們
仍然為一些人所擁戴。非解析實體允許一個X M L文檔包含對非X M L對象如二進制圖像或聲音的
引用;非解析注釋可以注冊和準確識別這些對象的格式。當遇到一個非解析實體時,解析器
(按照定義)不會做任何處理,而由應用程序進行解釋。但是應用程序只有在能夠識別外部實體
和注釋時才能處理它,因此它需要訪問D T D中的有關聲明。
因此S A X接口D T D H a n d l e r實際上只提供關于非解析實體與注釋很少而且非常特殊的信息,
盡管其名字暗示它可以提供對D T D中各種感興趣對象的訪問。如果需要這些信息,你可以像使
用其他事件處理接口一樣使用D T D H a n d l e r:編寫一個實現o rg . x m l . s a x . D T D H a n d l e r的類,并使
用DTDHandler( )方法為解析器注冊它。隨后解析器會告知D T D對非解析實體和注釋的聲明中使
用的系統標識符和公共標識符,然后當在文檔主體中遇到對這些對象(以E N T I T Y,E N T I T I E S
和N O TAT I O N類型屬性的形式)的引用時可以使用這些信息。
但是不要介意D T D H a n d l e r只提供了比其名字所許諾的少的信息!
6.3.3 選擇解析器
就這個標題,可以分別考慮兩個問題:
第6章SAX 1.0: XML簡易API使用169 下載
• 作為設計者,如何決定使用哪個產品?
• 作為程序員,如何把應用程序配置成可以在運行時選擇解析器?
第一個問題實際上超出了本書的范圍。我們已經列出了一些可用的S A X解析器,憑心而論,
它們之間的差別很小。它們都是免費的,盡管彼此的許可條件書不同:可以嘗試所有產品然后
選擇你喜歡的。
解析器一般分為兩類,由個人開發的和由組織機構開發的。這兩類產品一樣可靠。由組織
機構開發的解析器可能有更好的文檔資料和支持,它們也會包括許多輔助特性(如支持中文字
符編碼或有C O B O L / C I C S接口模塊)。如果你恰好需要這些特性,那么它們是很好的選擇;如果
不需要,它們將浪費硬盤空間和下載時間。
如果想要一個只進行S A X解析的解析器,對其他如速度、可靠性和與標準一致性等都不關
心,而且你不需要技術支持,那么還有幾個比從h t t p : / / w w w.jclark.com/xp 獲取的James Clark的
x p解析器更好的產品。AEl f r e d(h t t p : / / w w w. m i c r o s t a r. c o m / a e l f r e d . h t m l)是一個小巧的解析器,
可以選擇它嵌入到自己的應用程序中,特別是當下載時間有重要影響作用的a p p l e t中。S u n和
I B M的解析器可以對不正確的X M L文件生成更有幫助的診斷信息,所以它們在X M L編輯環境中
比較有用。對于其他解析器,主要考慮它們的運行環境:例如O r a c l e解析器在大量用到O r a c l e產
品的應用程序中是顯而易見的選擇。
實際上保留可選擇性是一個不錯的主意:你不知道解析器將來會怎么樣,而且也不知道應
用程序的潛在購買者是否也有如“拒絕無支持的軟件”或“拒絕沒有法語錯誤消息的軟件”的
策略。這就意味著你希望避免用決定性陳述的方式編寫應用程序,這把你和你的客戶限定于某
個特定的產品。例如:
如果是在一個如C O R B A(通用對象請求代理體系結構—參看h t t p : / / w w w. o m g . o rg)的分布
式對象環境中運行,這種問題正確的結構方法是應用程序授權Tr a d e r完成尋找解析器的任務,
Tr a d e r可以使用各種規則以發現滿足運行要求的解析器。可以理解S A X的設計者希望避免依賴于
這樣一個運行時環境,而是給你一些選擇:
• 可以使用S A X 發行版包含的簡單幫助類P a r s e r F a c t o r y 。應用程序調用靜態方法
P a r s e r F a c t o r y.makeParser( )。它通過讀取o rg . x m l . s a x . p a r s e r的系統屬性并將其作為一個類
名解釋。可以通過使用J a v a命令行的- D選項設置系統屬性,因此可以編寫一個命令行腳本
從環境變量中設置系統屬性。
• 可以實現自己的P a r s e r類初始化機制,類名在運行時確定。可以在一個配置文件或
Wi n d o w s注冊表中保留類名。假設可以把名字當作字符串讀取,你就可以使用如下的J a v a
語句創建一個Parser 實例。實際應用中,你需要添加一些錯誤處理以捕獲可能產生的各種
中國航空網 m.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(64)