曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
例外。
• 也可以在應用程序中創建已知解析器的列表,然后試著輪流加載它們直至找到一個可以成
功加載的解析器。這樣就允許你的用戶安裝類路徑上的任何一個解析器,當然不允許使用
170使用XML 高級編程
下載
一個你所不知道的解析器。
第二種技術的一個例子可以在P a r s e r M a n a g e r類中找到,該類可以從Michael Kay的S A X O N
包得到(參見h t t p : / / u s e r s . i c l w a y. c o . u k / m h k a y / s a x o n /)。該類根據一個叫P a r s e r M a n a g e r. p r o p e r t i e s
(S A X O N包提供)的配置文件里的信息初始化一個解析器。為了用一個不同的解析器運行應用
程序,只需簡單編輯配置文件(文件中寫明了指令)。P a r s e r M a n a g e r是可以不依賴于S A X O N包
中其他組件使用的獨立類,而且是自由發布的。一旦安裝了P a r s e r M a n a g e r,并且在類路徑中包
含屬性文件,你就可以創建一個SAX Parser,只需寫:
將會在后面的例子中實現這一操作。
6.4 一些SAX設計模式
上述S A X應用程序實例僅關注于處理一兩個不同的元素,而且這種處理是很簡單的。在實
際的應用程序中,需要處理很多個不同的元素類型,這樣程序的風格將會迅速地變得非常不結
構化了。主要有兩個原因:第一,處理相同全局上下文數據的不同事件的交互操作是很難解決
的;第二,每個事件處理方法都需要做一些完全獨立的操作。
所以為了避免這種情況,需要仔細考慮S A X應用程序的設計。本節提供了一些可能的方法。
下面看看以下兩種常用的模式:篩選模式和基于規則模式。
篩選設計模式
篩選設計模式,有時也稱為管道模式,其中處理過程的每一步都可以表示為管道的一段:
數據流經管道,每段管道篩選流經過的數據。如圖6 - 2所示。
圖6-2
一個篩選器可以做許多不同的事情,例如:
• 除去源文檔中不需要的元素。
• 修改標簽或屬性名。
• 進行確認驗證。
• 規格化數據值(如日期)。
篩選模式的重要特性就是每個篩選器都有輸入和輸出,它們遵循相同的接口。篩選器一端
實現了接口,另一端作為同一個接口的客戶端。所以任何相鄰的篩選器對,左邊的相當于解析
器P a r s e r,右邊的相當于文檔處理器D o c u m e n t H a n d l e r。實際上,這種結構中的篩選器一般同時
第6章SAX 1.0: XML簡易API使用171 下載
過濾器1 過濾器2 過濾器3
輸入輸出
實現S A X的P a r s e r和D o c u m e n t H a n d l e r接口。(在這里說“ P a r s e r”,當然可能不太恰當。S A X
P a r s e r的特性不是它可以理解X M L的文法和語法規則,而是它告知文檔處理器發生的事件。任何
發出這種通知的程序都可以實現SAX Parser接口,即使它可能不做任何實際的解析操作。)
篩選器也可能有多個輸出,通知多個接收者發生的事件;相對少見的情況是篩選器有多個
輸入,從多個數據源匯合事件。
篩選器設計模式的優勢是篩選器可以被高度復用,因為就像實際的管道裝置一樣,相同標
準的篩選器可以以很多不同的方式組裝到一起。
1. ParserFilter類
有很多工具可以用來創建上述形式的管道。最簡單的是John Cowan的P a r s e r F i l t e r類,可以
從h t t p : / / w w w. c c i l . o rg / ~ c o w a n / X M L /獲取。這是一個抽象類:定義了所有篩選器需要的操作,而
且允許你為自己管道中每個特定的篩選器定義子類。
正像你所期望的,P a r s e r F i l t e r同時實現了SAX Parser和D o c u m e n t H a n d l e r接口;實際上,它也額外
地實現了其他S A X事件處理接口(D T D H a n d l e r,E r r o r H a n d l e r和E n t i t y R e s o l v e r)。該類中的所有事件處
理方法所做的就是把事件傳送給管道中的下一個篩選器;定義的子類可以忽略任何需要加工的方法。
P a r s e r F i l t e r類有一個構造器可以把P a r s e r作為它的參數:結果是創建一段管道并且連接它到
其左邊的另一段管道。為創建上圖里的三段管道,可以編寫下列代碼:
程序清單6 - 1 6
管道的初始化輸入當然是一個SAX Parser,而最終輸出是一個SAX DocumentHandler。
2. ParserFilter實例:一個縮進器
下面是一個完全實現P a r s e r F i l t e r的實例I n d e n t e r。該篩選器接收S A X事件流,通過在開始和
結束標簽前添加空白格消息化數據,以使文檔的嵌套結構可視化。然后傳遞消息化的數據給下
一個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:
程序清單6 - 1 7
172使用XML 高級編程
下載
第6章SAX 1.0: XML簡易API使用173 下載
174使用XML 高級編程
下載
為了實際運行這個實例,需要一個輸出X M L文檔的D o c u m e n t H a n d l e r;假設存在一個叫做
X M L O u t p u t t e r的文檔處理器(下一節里將展示X M L O u t p u t t e r是如何編寫的)。然后可以編寫如
下的主程序:
程序清單6 - 1 8
還必須在文件的首部添加對P a r s e r M a n a g e r類的導入聲明:
程序清單6 - 1 9
為使程序更加實用可行,通過把輸入文件作為一個可以在命令行指定的參數(從a rg s [ 0 ]獲
取),并且通過使用前面介紹的P a r s e r M a n a g e r類創建下面的SAX Parser。它仍然不是一個生產性
程序,例如如果沒有輸入參數,它就會調用失敗,但是已經接近一個實用的生產性程序了。一
旦設置了類路徑(記住使用了P a r s e r M a n a g e r,P a r s e r M a n a g e r. p r o p e r t i e s文件必須也包含在類路徑
中),就從命令行運行程序,如:
可以看到輸出排版整齊地縮進。因為參數是一個U R L,所以可以格式化任何We b上的X M L
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(65)