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