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