曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
規”到底意味著什么。
2.12 格式正規的文檔
所有遵守X M L語法規范的數據對象(文檔)都是格式正規的X M L文檔。這類文檔在使用時
可以不使用D T D或模式來描述它們的結構,它們也被稱作獨立的( s t a n d a l o n e)X M L文檔。這些
文檔不能夠依靠外部的聲明,屬性值只能是沒有經過特殊處理的值或缺省值。
一個格式正規的X M L文檔包含一個或多個元素(用起始和結束標記分隔開),它們相互之間
正確地嵌套。其中有一個元素,即文檔元素,包含了文檔中其他所有元素。所有的元素構成一
個簡單的層次樹,所以元素和元素之間唯一的直接關系就是父子關系。兄弟關系經常能夠通過
X M L應用程序內部的數據結構推斷出來,但這些既不直接,也不可靠(因為元素可能被插入到
某個元素和它的一個或多個子元素之間)。文檔內容可能包括標記和/或字符數據。
數據對象如果滿足下列條件就是格式正規的文檔:
• 語法合乎X M L規范。
• 元素構成一個層次樹,只有一個根節點。
• 沒有對外部實體的引用,除非提供了D T D。
任何X M L解析器如果發現在X M L數據中存在并不是格式正規的結構,就必須向應用程序報
告一個“致命”錯誤。致命錯誤不一定導致解析器終止操作—它可以繼續處理,試圖找出其
他錯誤,但它不再會以正常的方式向應用程序傳遞字符數據和/或X M L結構。
之所以采用這類錯誤處理方式,一是因為X M L簡潔的設計風格,二是因為X M L更多的不是
用于顯示—因為這不太容易使得X M L數據對象做到格式正規。這種近乎殘酷的錯誤處理會阻
礙類似Internet Explorer和N a v i g a t o r之類臃腫的軟件的創造性(它們擁有各類特殊代碼來解決如
何處理意義含糊的H T M L)。
對于H T M L / S G M L來說,它們的工具都要比X M L寬容許多。H T M L瀏覽器通常會顯示出
大多數支離破碎的W e b頁面,這為H T M L的快速流行做出了巨大貢獻。此外,真正的顯示
會因瀏覽器而異。同樣,SGML工具即使遇到錯誤,通常也會盡力繼續處理文檔。
格式正規的文檔的存在使得可以使用X M L數據而不必承擔構建和引用外部描述的重任。術
語“格式正規”與正式的數學邏輯有著相似之處—一個命題如果滿足語法規則就是格式正規,
而不在于它的正確與否。
44使用XML 高級編程
下載
2.13 解析器
除去指定X M L的語法,W 3 C推薦標準還描述了X M L客戶端體系結構(X M L處理器或解析器)
中低層次的一些行為。目前,有兩種類型的解析器:
• 非驗證的( n o n - v a l i d a t i n g)—解析器僅僅保證數據對象是格式正規的X M L
• 驗證的(Va l i d a t i n g)—解析器使用D T D保證格式正規的數據對象的形式和內容的有效性。
一些解析器同時支持兩種類型,其中有判定數據對象是否是需要驗證的文檔的配置開關。
X M L解析器的一些行為在定義時是為了減少應用程序處理X M L數據的負擔。例如,正如我
們在前面描述的那樣,用來界定文本記錄結束位置的字符序列通常是因操作系統而異的。但是
一個X M L應用程序不必關心這個,因為X M L解析器會把所有標準的文本記錄分隔符格式化為一
個換行符(十六進制值0 A)。空白的處理是解析器嚴格要求的另一個領域—與H T M L或S G M L
不同,所有的空白都必須從文檔傳遞給應用程序。而且,正如外部或內部D T D子集所描述的那
樣,普通的(字符)實體會通過解析器加以擴充。
X M L解析器在把屬性值(即下面的A t t Va l u e)傳遞給X M L應用程序之前需要對它們格式化。
這意味著解析器將需要處理下面的引用和字符:
• 字符引用—將引用的字符添加到A t t Va l u e當中。
• 實體引用—遞歸地展開實體的替換文本,添加到A t t Va l u e當中。
• 空白字符—替換任何回車/換行字符對,它們可能是外部解析實體的組成部分,內部解析
實體的字符串實體值,或者是空格字符(十六進制值2 0)代表的任何空白字符,然后在
A t t Va l u e當中添加空格。
• 其他所有字符—將字符添加到A t t Va l u e當中。
接下來, A t t Va l u e會做進一步處理,刪除掉前面和/或后面的空格,然后把多個空格序列轉
化成單個空格。這個規則的唯一例外就是如果屬性值在D T D中被聲明為C D ATA,而且使用的是
需驗證的解析器(參見第3章關于D T D的描述和明確的聲明)。
實現X M L解析器有兩種方法。雖然針對它們的爭論非常之多,但是每種方法都有它們的優
勢。與許多其他現實世界中的問題一樣, X M L的處理的需求會有著極大的區別,所以不同的方
法會適合不同的解決方案。
2.13.1 事件驅動的解析器
處理X M L數據的一種方法是使用事件驅動的解析器,其模式對于現代G U I(圖形用戶界面,
Graphical User Interface)和O S(操作系統, Operating System)的編程者來說實在是再熟悉不
過了。在這種情況下, X M L解析器為每類X M L數據執行到應用程序的回調:元素(及其屬性)、
字符數據、處理指令、符號或者注釋。這等于是應用程序通過回調來處理X M L數據—X M L解
析器在解析之后并不維護元素的樹結構,或者任何數據。事件驅動的辦法對系統資源的需求及
其普通,即使對于非常大的文檔也是如此;正是得益于這種簡單的、對X M L數據結構的低層次
的訪問,X M L應用程序在處理數據時具有相當大的靈活性。
在這類解析器中,最早的、也是最為著名的一個一流程序就是James Clark的e x p a t,它用
第2章XML 語法使用45
下載
A N S I - C寫成。它還有相應的C + +(e x p a t p p)、P e r l(X M L : : P a r s e r)和P y t h o n(P y e x p a t)包裝器。
C l a r k是XML 1.0推薦標準的技術領袖,他還曾經用J a v a編寫了另一個解析器x p。
由David Megginson(M i c r o s t a r的A e l f r e d解析器的作者)領導的X M L - D E V郵件列表的成員
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(19)