曝光臺 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
因為某些原因受這種限制),這種情況可能直到程序成功運行幾個月后都不會發(fā)生。注意這種問
題。
有一種情況解析器必須分解文本,就是當(dāng)使用外部實體的時候。S A X規(guī)范明確規(guī)定一個
character( )調(diào)用不能包含來自兩個不同外部實體的文本。
如果想直接對字符數(shù)據(jù)操作而不是簡單地?zé)o條件地復(fù)制它到輸出文件,你也許會對其所屬
哪個元素感興趣。然而S A X接口不會直接提供這種信息。如果需要這種上下文信息,你的應(yīng)用
程序必須維護一個數(shù)據(jù)結(jié)構(gòu),它保留以前事件的一些內(nèi)存映像。最常見的是堆棧。在下一節(jié)會
說明如何使用一些簡單的數(shù)據(jù)結(jié)構(gòu),既能組合解析器提供的字符數(shù)據(jù)片段,又可以確定它所屬
的元素。
這是第二種報告字符數(shù)據(jù)的方法,即:
• ignorableWhitespace(char[] chars, int start, int len)
這個接口可以告知S A X規(guī)范泛指的“可忽略空白”。如果D T D用“元素內(nèi)容”定義了一個元
素(也就是說元素可以有子元素,但不能包含P C D ATA),那么即使“真正”的字符數(shù)據(jù)是不允
許的, X M L也可以用空格、制表符和換行分割開子元素。這種空白很可能是無關(guān)緊要的,所以
一個S A X應(yīng)用程序幾乎總是忽略它:你可以僅僅通過使用一個空操作的i g n o r a b l e W h i t e s p a c e ( )方
法實現(xiàn)。只有當(dāng)你的應(yīng)用程序把輸入數(shù)據(jù)不加改變地復(fù)制到輸出時,你才有可能想做一些其他
操作。
然而X M L規(guī)范允許一個解析器忽略外部DTD 中的信息。非確認(rèn)解析器不需要辨別包含元素
第6章SAX 1.0: XML簡易API使用155 下載
內(nèi)容的元素和包含混合內(nèi)容的元素。在這種情況下,可忽略空白可以通過一般的characters( )接
口被告知。
不幸的是無法在一個S A X應(yīng)用程序中判斷解析器是否是確認(rèn)型的,所以一個可移植的應(yīng)用
程序必須考慮到這兩種情況。這也是S A X的一個局限性,但是在SAX 2.0里得到了修正。
(4) 處理指令
解析器還報告一種被稱為處理指令的元素。你很可能不會經(jīng)常地遇到處理指令:它們是可
能出現(xiàn)在X M L文檔中“< ?”“? >”之間任何位置的指令。一個處理指令有一個名稱(即目標(biāo))和
任意特征數(shù)據(jù)(目標(biāo)應(yīng)用程序有關(guān)的指令)。
處理指令通過下面的方法通知給D o c u m e n t H a n d l e r:
• processingInstruction(String name, String data)
按照約定,應(yīng)該忽略所有的處理指令(或者不加改變地復(fù)制它),除非可以識別處理指令的
名稱。
在文檔開始的X M L聲明可能像是一個處理指令,但是它不是一個真正的處理指令,并且
不會通過上述接口告知應(yīng)用程序—實際上是什么也不告知。
處理指令經(jīng)常被寫成像元素開始標(biāo)簽的形式,包含一連串k e y w o r d = " v a l u e "屬性。然而這種
語法對一個應(yīng)用程序約定是完備的,而不在X M L標(biāo)準(zhǔn)中定義。所以S A X不能識別它;處理指令
數(shù)據(jù)的內(nèi)容被當(dāng)作亂七八糟的東西被忽略掉。
4. 錯誤處理
到目前為止我們掩飾了對錯誤的處理,但是在一個真正的生產(chǎn)性應(yīng)用程序中,錯誤處理總
是需要認(rèn)真考慮的。
主要有三種錯誤可能出現(xiàn):
• 不能打開X M L輸入文件或者它引用的另一個文件,例如D T D或另一個外部實體。在這種
情況下,解析器就會產(chǎn)生一個I O E x c e p t i o n(輸入/輸出異常)而由應(yīng)用程序處理它。
• 解析器檢測到的X M L錯誤,包括規(guī)范化錯誤和合法性錯誤。可以通過調(diào)用應(yīng)用程序提供的
錯誤處理器進行錯誤處理,如下面所述。
• 應(yīng)用程序檢測到的錯誤:例如屬性中不完整的日期或數(shù)字。可以通過在檢測到錯誤的
D o c u m e n t H a n d l e r方法中產(chǎn)生一個例外進行錯誤處理。
(1) 處理X M L錯誤
根據(jù)X M L標(biāo)準(zhǔn)自身用到的術(shù)語, S A X規(guī)范對錯誤嚴(yán)重程度定義了三個級別(參見表6 - 2)。
表6 - 2
錯誤描述
致命錯誤通常表示X M L格式不正確。如果存在注冊的錯誤處理器,解析器
就會調(diào)用它;反之解析器產(chǎn)生一個S A X P a r s e E x c e p t i o n。大多數(shù)情
況下,解析器發(fā)現(xiàn)第一個致命錯誤后就會終止運行
錯誤通常表示X M L格式正確但不合法有效。如果存在注冊的錯誤處理
器,解析器就會調(diào)用它;反之解析器將忽略錯誤
156使用XML 高級編程
下載
(續(xù))
錯誤描述
警告表示X M L是正確的,但是解析器認(rèn)為報告一些情況是有用的。例
如可能是一個“交互操作”規(guī)則的沖突:輸入是正確的X M L但不是
正確的S G M L。如果存在注冊的錯誤處理器,解析器就會調(diào)用
它;反之解析器將忽略錯誤
應(yīng)用程序可以通過解析器的setErrorHandler( )方法注冊一個錯誤處理器。錯誤處理器包含三
個方法,fatalError( ),error( )和warning( ),分別對應(yīng)三種級別的錯誤。如果不想定義全部三種
方法,你可以創(chuàng)建一個從H a n d l e r B a s e繼承而來的錯誤處理器:它包含所有三種方法的樣式,但
所做的操作和沒有注冊錯誤處理器相同。
在所有三種情況下,錯誤處理器方法的參數(shù)是一個S A X P a r s e E x c e p t i o n對象。你可能認(rèn)為當(dāng)
錯誤發(fā)生時產(chǎn)生并處理的是J a v a例外;但是實際上例外是一個正規(guī)的J a v a對象,可以像其他J a v a
對象一樣作為一個參數(shù)傳遞給方法:也可能根本不會被產(chǎn)生。S A X P a r s e E x c e p t i o n包含錯誤的有
關(guān)信息,如它在X M L源文件中何處出現(xiàn)。錯誤處理器方法最常見的操作是抽取這些信息以生成
一個錯誤消息,錯誤消息可以被寫到適當(dāng)?shù)哪繕?biāo)文件:例如一個We b服務(wù)器日志文件。
錯誤處理器方法還可以產(chǎn)生異常:異常經(jīng)常被當(dāng)做參數(shù)由解析器提供,但不是必須這樣。
如果異常產(chǎn)生了,解析一般會被終止,并且高層的應(yīng)用程序會看到由parse( )方法產(chǎn)生的相同的
異常。這是另一個輸出診斷消息的時機。是從錯誤處理器里生成一個致命錯誤消息還是讓高層
應(yīng)用程序捕獲異常,這完全由你決定。
中國航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(60)