曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
第4章數據建模與XML使用101 下載
特殊的規定。非正式地講,它表示文檔必須符合D T D中的規則。我們對于D T D不能表示的許多
約束感興趣,其中有些約束是X M L模式也無法表達的—例如,一條消息開始處的序號必須比
前一條消息的序號大一。本章后續部分出現的“有效”一詞與X M L中的“有效”含義不同,它
是面向用戶的:如果文檔能夠滿足信息模型定義的所有約束,就認為它是有效的。
1. 為什么需要模式
以下論述摘自W3C XML模式建議的草案:
模式的目的是定義和描述一類X M L文檔,它使用[ m a r k u p ]結構約束和說明各個組成部分
的含義、用法和關系,這些組成部分包括:數據類型、元素及其內容、屬性及其內容、
實體及其內容,以及表示法。模式結構還能夠提供附加信息的規范,例如:缺省值。模
式試圖通過通用的文檔詞匯表說明自身的含義、用法和功能。因此, X M L模式結構能夠
為各類XML文檔定義、描述和歸類XML詞匯表。
我們認為以上論述說明了模式的功能,但并未說明原因。通過這段話,我們總結出模式有
以下兩個作用:約束和解釋。
2. 模式的約束功能
模式的作用之一是定義有效文檔與無效文檔之間的差別。規則的表述應該盡可能使軟件能
夠判斷一個文檔是否有效;但是在實際應用中,有些規則可以是只有人類才能夠解釋的。例如,
科學雜志的一條規則規定作者的地址必須只能包括城市和國家,或者摘要必須是法語的。
之所以需要這些約束,有以下兩點原因:格式上的原因(每個出版物都要維護自己的品牌
圖像、樣式和設計的完整性)和處理的原因。處理的原因定義了處理過程的下一階段(即:處
理文檔)對信息的需求,無論這個過程是個商業過程(如:處理職位申請表)、印刷過程,還是
內部系統過程(如:更新數據庫)。在這兩種情況下,約束都可以看作是一種品質控制。
當然,約束并不總是好的。這是一種巨大的誘惑,你可能毫無顧忌地利用規則的約束能力對系
統進行過度嚴格的限制。信息系統常常不夠靈活,我們的目標應該是明智地使用約束,使得處理活
動中的人能夠最大限度地發揮他的聰明才智。如果使用過度,約束本身會對信息的質量產生負作用:
我過去不得不給電子商務系統提供錯誤的數據,因為這個We b頁面堅持我的地址必須位于美國。
另外,我們的確能夠定義明確的規則,并用軟件進行檢查,但是這并不意味著在可以想象
得到的每個處理階段都利用規則驗證文檔的有效性。例如,當你從We b服務器向外傳送文檔時對
它進行檢查就是多余的:當它被放到We b服務器上時應該檢查有效性。另外,有些人盲目地毫無
顧忌地使用驗證有效性的解析器。類似地,當X M L文檔從一個軟件系統發送到同一組織機構中
的另一個軟件系統時,在測試階段有必要驗證其有效性,但是當一切正常運轉之后,就不必重
復地驗證有效性,因為軟件之間應該相互信任。
3. 模式的解釋功能
模式的第二個作用是解釋—記錄結構的說明和用法,使得發送方和接收方能夠對消息有
相同的理解。
在文檔和數據庫領域,模式的這個作用都是次要的,雖然它實質上可能更加重要。部分原
因在于模式總是不能提供給需要它的人,即:在屏幕上輸入數據的人。這就是為何許多系統都
102使用XML 高級編程
下載
受到一種稱為語義漂移的現象的困擾,隨著時間的推移,用戶有改變系統使用方式和更改數據
字段含義的傾向,即使軟件結構并未發生變化。在我遇到的一個例子中,用戶故意輸入會遭系
統拒絕的數據,因為有待糾正的記錄文件能夠方便地記錄明天要打的電話。在另一個系統中,
我發現通訊社以發送虛假的新聞文章為幌子向客戶發送發票。
你不能阻止這些事情的發生,正如建筑師不能阻止居住者在廚房里看電視。你所能做的是
盡量解釋你所提供的結構的用途,并為用戶提供靈活的空間,使得他們在不違背你的設計的前
提下達到自己的目的,而且使你的結構盡可能地直觀和自然,以免用戶產生被強迫走另一條路
的感覺。
端用戶不必直接了解模式,這也意味著模式應該是應用程序可讀的:例如,應用程序應該
能夠提取數據字段的解釋,并將這些解釋作為提示文本顯示在輸入數據的屏幕上。七、八十年
代,模式的這種觀念非常流行,它出現在數據字典中:數據字典強調模式在定義系統詞匯中名
稱的含義方面的作用,雖然軟件公司對數據字典的濫用(他們將數據字典做成內部系統目錄)
導致它最終被淘汰。
4.3.2 將DTD作為模式
如果模式的作用是約束和解釋,那么XML DTD的局限性就顯而易見了。它主要體現在以下
幾方面:
(1) DTD能夠表示哪些約束
作為一種約束語言, D T D是非常有限的。它能夠控制元素的相互嵌套,卻對元素中包含的
內容無能為力。它對屬性的控制略微強一些,但即使如此也是非常有限的,例如: D T D無法規
定某個屬性值必須是數字。這必然意味著許多實際的有效性驗證工作必須由應用程序來完成;
事實上,我常常發現D T D的驗證功能基本上沒什么價值,不值得使用。
(2) 你能夠依賴D T D的有效性驗證嗎
即使在D T D能夠定義的有限的規則中, X M L文檔仍然可以設置自己的議程:是否引用D T D,
引用哪個D T D,以及是否用私有的內部子集中的聲明覆蓋D T D中的聲明,這些都是由文檔本身
決定的。即使應用程序知道將使用驗證有效性的解析器,文檔樂于接受哪些約束也是由文檔本
身來決定的,應用程序不能將自己的意愿強加給它。
假設你為旅游路線定義了D T D—i t i n e r a r y. d t d。為了將旅游路線郵寄給客戶,你的應用程
序要負責打印旅游路線。如果應用程序不希望由自己來驗證有效性,它需要確保輸入的文檔符
合名為i t i n e r a r y. d t d的D T D。為此,它要保證:
• 它所使用的解析器是能夠驗證有效性的。(這一條是不言而喻的,但是你的應用程序是使
用S A X、D O M還是X S LT,就很難判斷了。)
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(44)