曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
的自然擴展。
XSL 處理模型(第9章中將討論)可以被看作是一個基于規則編程的例子。所有X S L模板制
定一個規則:事件處理源文檔中的節點;條件控制激活哪個模板的模式;操作是模板的主體部
分。可以使用S A X應用程序中相同的概念。
圖6 - 3說明了一個基于規則S A X應用程序的結構。從X M L解析器得到的輸入傳到一個開關,
開關根據已經定義的條件分析事件,決定激活哪個動作。然后操作被傳遞給設計用于實現特定
任務的處理模塊。
圖6-3
可以實現各種類型的條件和操作,但是下面描述一個非常簡單的實現,它的條件只基于一
個元素類型。
首先,需要編寫D o c u m e n t H a n d l e r。因為它的工作是把處理操作切換到處理特定元素類型的
一段代碼,所以可以稱它為開關器( S w i t c h e r)。
第6章SAX 1.0: XML簡易API使用181 下載
開關處理模塊
輸入輸出
開關器所做的是維護一組哈希表( H a s h t a b l e )形式的規則。規則集合按照元素類型索引。應用
程序可以指定一個叫做E l e m e n t H a n d l e r的類處理特定的元素類型。當解析器報告一個元素開始標
簽,相應的E l e m e n t H a n d l e r 放在規則集合里并被調用以處理這個開始標簽。同時,
E l e m e n t H a n d l e r在堆棧里記錄,這樣相同的E l e m e n t H a n d l e r可以用于處理元素的結束標簽和元素
中直接出現的字符數據。
整個開關器的代碼如下:
程序清單6 - 2 1
182使用XML 高級編程
下載
E l e m e n t H a n d l e r有點類似于D o c u m e n t H a n d l e r,但是它只是處理了事件的子集:元素的開始
和結尾,以及字符數據。所以盡管在這里可以使用D o c u m e n t H a n d l e r,我們仍定義了一個特定類。
這可以作為接口的定義使用,也可以作為實際元素處理器的超集使用:良好的J a v a編程實踐可能
建議使用一個獨立的接口類,但是現在可以這樣做:
程序清單6 - 2 2
第6章SAX 1.0: XML簡易API使用183 下載
到此為止,這是一個完整的通用模型。可以對各種類型的文檔使用S w i t c h e r 和
E l e m e n t H a n d l e r類進行各種處理操作。現在在一個實際的應用程序中使用它們:我們想要生成一
個H T M L頁面顯示從書目列表選擇的數據。
下面是相應的應用程序。我們將從主控制結構開始。應用程序創建了一個S w i t c h e r并注冊了
幾個E l e m e n t H a n d l e r類以處理在輸入X M L文檔中的特定元素。然后它創建一個P a r s e r,指定
S w i t c h e r為D o c u m e n t H a n d l e r,并進行解析:
程序清單6 - 2 3
實際的元素處理器可以被定義為D i s p l a y B o o k L i s t類中的一個內部類:這有助于它們共享對
數據的訪問。
處理最外面的元素“ b o o k”的E l e m e n t H a n d l e r創建一個H T M L頁面框架:
程序清單6 - 2 4
184使用XML 高級編程
下載
處理多個“b o o k”元素的E l e m e n t H a n d l e r開始并結束生成的H T M L表中的行,并初始化一些
變量以存放數據:
程序清單6 - 2 5
最后,處理< b o o k >元素中字段的元素處理器更新存放數據的本地變量。為了使程序結構清
晰,在這里沒有考慮性能問題—使用S t r i n g B u ff e r s變量程序的性能會好于使用S t r i n g s變量。
程序清單6 - 2 6
第6章SAX 1.0: XML簡易API使用185 下載
i n Vo l u m e標志用來跟蹤當前元素是否包含于一個< v o l u m e >包容元素中,在這種情況下,它
是可以忽略的。一旦把所有的代碼匯合在一起(完整的代碼可以在h t p : / / w w w. w r o x . c o m找到),
可以用下面的命令運行程序處理一個X M L實例文件:
輸出將如下所示:
程序清單6 - 2 7
186使用XML 高級編程
下載
可以按你所需加工細化該設計模式。可以在以下方面進行優化提高:
• 允許元素處理器訪問包含它們上下文細節信息的堆棧。
• 根據條件而不僅僅根據元素名稱選擇元素處理器。
• 通過允許元素處理器把事件傳送給另一個D o c u m e n t H a n d l e r,把事件處理器當作管道的一
部分使用。
該設計模式的優點是避免了許多i f - t h e n - e l s e程序語句。在每引入一個新的元素類型時,它不
需要更改D o c u m e n t H a n d l e r以添加條件邏輯。取而代之的是只需注冊另外一個元素處理器。
6.5 SAX 2.0
SAX 1.0已經被非常普遍地實現,并且幾乎從1 9 9 8年1月1 2日第一個草稿發布那天起,即比
XML 1.0的最終建議稿早一個月,它已經被廣泛地使用。它很好地滿足了用戶的需求,盡管也有
一些批評意見,其中有些在本章提到了。
所以后續版本SAX 2.0的開發就是自然而然的了,它的開發相對來說不是那么緊迫。在1 9 9 9
年的前幾個月, X M L - D E V郵件列表討論了有關的需求情況,而且David Megginson在1 9 9 9年6月1
日發布修改規范的測試版本(盡管沒有廣為宣傳通告)。基本上取得了一致意見,看起來SAX 2.0
的最終規范接近于它現在的形式,可以在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 2 /站點找到。
該規范是否能被廣泛地支持是另一個問題。時間會證明一切。
對原S A X接口的擴展方法本身是很有意思的。已經定義了一個標準機制,允許應用程序要
求解析器支持特定的特性或設置特定的屬性;解析器在任何情況下都可以拒絕該要求。特性和
屬性的集合特性和屬性可以在任何時候被任何人提交產生。為了達到這一點,特性和屬性是用
U R L來標識,很類似于X M L命名空間的標識方式。
6.5.1 可配置的接口
S A X 2中主要的新接口是C o n f i g u r a b l e接口。一個S A X 2解析器必須像實現o rg . x m l . s a x . P a r s e r
接口一樣實現o rg . x m l . s a x . C o n f i g u r a b l e。C o n f i g u r a b l e接口包含四個方法(參見表6 - 4)。
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(67)