曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
D T D下不被允許。我希望已經告訴你了命名空間是有用的。驗證也是有用的。使二者一致就是
200使用XML 高級編程
下載
XML 模式的好處之一。
7.5 模式
第一件要弄清楚的事是D T D實際上是一種模式。但是當X M L領域里的人們提及模式時,他
們通常是指用X M L語法寫成的D T D替代物,是一個我們在這一章用過的術語。這里對于D T D有
很多可供選擇的提議,并且W 3 C組織當前正致力于從這些工作中建立一個標準的可以選擇的繪
圖靈感。在某種意義上,我們可以把模式想象為一種強制機制,其中定義了允許的元素、屬性
等等,我們正在約束使用者選擇標記和他們的內容模型。
通常,我們能夠把模式說成元數據或關于數據的數據,并且當我們快要明白一些模式的成
果不止參與定義詞匯表時,它們早就開始去解釋特定類型數據的關系。
如果你想要替換D T D,需要具備至少與他們相同的能力。你需要描述X M L文檔的自然狀態
和結構。就像D T D,一個模式是X M L詞匯表組建和規則的描述。模式靠許可在表達一些詞匯表
概念有更高的精度細化了D T D。并且模式做了一些大幅度的改變。它們使用了完全不同于D T D
的語法。它們允許我們去借用其他的模式,而且解決了你在最后的命名空間例子里遇到的問題。
它們提供了元素和屬性的數據類型。整個模式實際上對于描述詞匯表問題是個更好的答案。
X M L與D T D結合得很好。與此同時,在改進它們的問題上有很大的興趣。這種興趣包括多
種形式,其中有各種已被采納的建議(其中幾種可從注解中的W 3 C站點得到)。當這些成為工作
中重要的一部分時,這也推遲了一個涉及多個最普遍的模式急需特征的推薦標準的采納。特別
是,許多開發者想要很強的分類能力去驗證多個命名空間,并在一些時候使用X M L語法。幸運
的是,這種狀況已經被解決。在寫這本書的時候( 2 0 0 0年1月),關于模式的W 3 C工作組在使許
多對模式語言有貢獻的建議合成一個有用的描述上做得很好。改進的模式給X M L文檔自動交換
數據帶來很大的益處。
7.5.1 與DTD有關的問題
你可能在學習D T D語法和規則上投入了很大的精力,并且缺少模式描述不能阻止你探索許
多X M L的好處和研究許多有趣的例子。因此你可能奇怪D T D出了什么問題,以至于你必須學習
一種新的方法。首先,學習D T D非常值得,這是因為(在寫的時候)它們對于描述你自己的標
記只提供了一種標準。并且,有許多用D T D定義過的標志語言,讀懂它們對于采納標志非常有
幫助。
但是,正如我們在第3章里建議的,D T D有幾個缺點,并且當我們試著用X M L做更多的事情
時,這些缺點會變得更加明顯。
• 它們很難寫及理解。
• 它們的元數據在程序處理時非常困難。
• 它們不可擴展。
• 它們不對命名空間提供支持。
• 它們不支持數據類型。
• 它們不支持繼承。
第7章命名空間和模式使用201 下載
讓我們按順序看一下每個問題。
1. DTD很難寫及理解
比起XML ,D T D使用一種語法,即Extended Backus Naur Form(EBNF),并且許多人發現它
很難閱讀和使用。而被提議的XML 模式實際上使用了X M L去描述它們定義的語言,在學會讀、
寫它們之前去掉了學習E B N F的困難。
2. 程序處理元數據非常困難
使用E B N F也使在D T D里自動處理元數據非常困難。這里當然是指D T D的解析器。你可能已
經有了一個;它是你偏愛的經過限定的解析器。經過限定的解析器在它們能夠驗證一個適合的
文檔之前必須裝載和讀入D T D。但是不可能從一個程序使用D O M去探究D T D。D O M不能提供訪
問用E B N F寫成的詞匯表元數據。你的驗證過的解析器讀了D T D并保護它的信息的完整。如果
D T D用X M L寫成,而我們能夠像研究根據規則寫成的文檔那樣研究它們,這不是很好嗎?這個
特性將允許我們使用D O M去調查新遇到的詞匯表結構或者甚至為了驗證依據運行時的條件修改
一個詞匯表的規則。
3. DTD不可擴展并且不對命名空間提供支持
正如我們在命名空間檢測看到的,一個D T D是i t。一個詞匯表里所有的規則必須存在于D T D。
你將需要的每一件事放入D T D,并且你與它們同在。你不能不建立擴展實體而從其他源借用。
既然寫了c a t a l o g . d t d文件,你應該想要在代碼上加一個新的部分,為了新的< r e l e a s e D a t e >元
素,整個D T D將要必須重寫。即便你通過拷貝和粘貼其中的大部分來實現這些,你必須小心地
確定現有的文檔仍然有效。
進一步講,創建并維護你自己的標記聲明的子集并不像簡單地引用現有的定義那樣靈活。
你不能允許文檔作者在后面包含一些有趣的而在D T D里沒有發現的東西。當然,我們并不是經
常給文檔作者這么大的自由度,但當設計一個新詞匯表時給出一個選項,即可以利用現有模式
的一部分,那將變得非常好。
還有,因為一個詞匯表里所有的規則必須存在于D T D,如我們所看到的,你不能混合命名
空間。雖然你能使用一個命名空間去將元素類型引入一個文檔,你不能使用命名空間去查閱一
個D T D里的元素聲明。如果一個命名空間使用了這個命名空間的所有元素,它必須在D T D里聲
明。
4. DTD不支持數據類型
X M L最強勁的地方是各個文檔完全用一個通用的數據類型-文本寫成。當我們寫程序時,經
常需要談論類型而不是文本。比起文本, D T D沒提供幾種數據類型,當我們在特定類型的應用
程序里使用X M L時,這是一個非常嚴重的缺陷。
因為D T D提供無標準的機制去包含無文本類型的我們標記的數據,這意味著我們必須暗中
共享有關數據類型的信息,在解析文檔時為我們自己執行轉換。比如我們想要完成一些在數字
元素內容上的循環,在應用能夠被希望處理這些數據之前,必須要將文本轉換成合適的數據類
型。
5. DTD不支持數據繼承
采用D T D沒有辦法表達繼承,于是你設想一下,我們有一個稱為“ b o o k s”的類,這里沒有
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(73)