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