曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
文件。
3. 管道的終點:生成X M L
如前例所示,經常管道最終的輸出會是一個新的X M L 文檔。所以常常需要一個
D o c u m e n t H a n d l e r,使用來自管道的事件流生成X M L文檔:一種反向的解析。
奇怪的是不能在We b上找到實現這種功能的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章SAX 1.0: XML簡易API使用175 下載
J a v a比較少用到的處理字符串和數組的方法:
程序清單6 - 2 0
176使用XML 高級編程
下載
第6章SAX 1.0: XML簡易API使用177 下載
178使用XML 高級編程
下載
現在可以看到S A X是如何像讀取X M L文檔一樣編寫X M L文檔。實際上,可以接連運行S A X:
代替P a r s e r這種由其他人編寫的標準軟件,而D o c u m e n t H a n d l e r是特定的應用代碼,可以編寫
o rg . x m l . s a x . P a r s e r的實現,其中包含你生成X M L的應用邏輯,使其和非標準的D o c u m e n t H a n d l e r
第6章SAX 1.0: XML簡易API使用179 下載
配合編寫X M L文檔輸出。
4. 其他P a r s e r F i l t e r
下面是一些其他有用的P a r s e r F i l t e r。
(1) NamespaceFilter
該P a r s e r F i l t e r實現在第7章中描述的XML 命名空間建議稿。可以從John Cowan 的
h t t p : / / w w w. c c i l . o rg / ~ c o w a n / X M L /站點獲取此建議稿。
S A X在XML 命名空間建議稿發布之前就定義了,因此沒有考慮到命名空間。如果一個元素
名在源文檔里以< h t m l : t a b l e > 形式書寫,那么傳遞給s t a r t D o c u m e n t ( )方法的元素名將是
“h t m l : t a b l e”。應用程序很難確定“ h t m l”引用的是哪個命名空間。
N a m e s p a c e F i l t e r解決了這個問題。N a m e s p a c e F i l t e r跟蹤文檔中所有的命名空間的聲明(即
“x m l n s : x x x”屬性),當帶前綴的元素或屬性名稱被S A X解析器通告,N a m e s p a c e F i l t e r在把它沿
管道繼續傳遞之前,用整個命名空間U R L代替元素前綴。例如,如果元素開始標簽是< h t m l : t a b l e
x m l n s : h t m l =“h t t p : / / w w w. w 3 . o rg / T R / R E C - h t m l 4 0 >”,那么傳遞給下一個D o c u m e n t H a n d l e r的元素
名將是“h t t p : / / w w w. w 3 . o rg / T R / R E C - h t m l 4 0 ^ t a b l e”。“^”用來把命名空間U R L和元素的本地部
分分開,因為" ^ "不能出現在U R L或X M L名中。
有時應用程序不僅需要知道命名空間U R L,同樣也希望知道前綴信息(例如,用在錯誤消
息中)。N a m e s p a c e F i l t e r不提供此類信息,但是它很容易擴展以提供此類信息。
(2) InheritanceFilter
InheritanceFilter 也可以從John Cowan的站點h t t p : / / w w w. c c i l . o rg / ~ c o w a n / X M L /獲取。
很多X M L文檔設計使用可繼承屬性的概念。這種思想是如果元素的特定屬性沒有出現,則
其值從其包容元素的同一屬性中獲取。X M L標準本身采用了這種思想,對特殊的屬性x m l : l a n g
和x m l : s p a c e,這種思想在一些其他標準如X S L格式化對象建議中也被采用。
I n h e r i t a n c e F i l t e r是一個P a r s e r F i l t e r,它通過包含那些元素中沒有真正出現但是從父元素中
繼承的屬性,擴展了屬性列表。擴展了的屬性列表傳遞給s t a r t E l e m e n t ( )方法進行處理。
I n h e r i t a n c e F i l t e r需要用被作為繼承屬性處理的屬性名列表進行修剪。
(3) XLinkFilter
X L i n k F i l t e r提供對X L i n k規范草稿關于在X M L文檔間創建超鏈接的支持。Simon St.Laurent
在h t t p : / / w w w. s i m o n s t l . c o m / p r o j e c t s / x l i n k f i l t e r /站點發布了X L i n k F i l t e r。
不像大多數的P a r s e r F i l t e r,X L i n k F i l t e r不加改變地傳遞所有的事件。然而在此之中,
X L i n k F i l t e r創建了一個數據結構以反映文檔中遇到的XLink 屬性。在管道的后續步驟中可以查詢
該數據結構。
X L i n k規范中定義的一種鏈接是所謂的“包含”鏈接,鏈接文本被設計用于在主文檔中按行
顯示—很像C中的預處理# i n c l u d e命令。相應的X L i n k語法是s h o w =“p a r s e d”。這很類似于一個
外部實體參照,除了應用程序可以控制決策是否和何時包含鏈接文本:例如,用戶可能在顯示
文檔的長短形式上做選擇。當然,可以實現一個直接擴展這種鏈接的篩選器,提交包含文檔給
管道的后續步驟,就像包含文檔是物理地嵌入到源文檔中一樣。
(4) 共享上下文的管道
180使用XML 高級編程
下載
有關管道的一個潛在的問題是其中的每個篩選器必須自己處理其他篩選器已經識別的東
西;一個常見的例子是當前元素的父元素。如果一個篩選器已經維持了一個確定此類信息的元
素堆棧,那么其他的篩選器重復同樣的工作是一種浪費。
可以通過允許篩選器訪問以前篩選器創建的數據結構,或者直接通過公共方法,解決這個
問題。但是這需要管道中的篩選器彼此之間了解比單純管道模型更多的信息,這降低了任意組
裝篩選器的可能性。可以論證,當處理達到這種復雜程度時,最好完全不使用基于事件的處理
方法,而是使用D O M(采用導向性設計模式)。
5. 基于規則的設計模式
創建S A X應用程序的另一種方式是基于規則的方法,它的目標也是功能分割,結構模塊化
和簡單化。
一般情況下,基于規則的程序使用一種“事件-條件-操作”的模型:程序包含形如“如果事
件在此條件下發生,則執行操作”的規則集合。基于規則編程因此可以被看作是基于事件編程
中國航空網 m.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(66)