曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
定義這些D T D都能夠共享的外部參數實體。
• 可以為所有文檔類型使用相同的D T D,但是每一部分使用不同的頂級元素標記。D T D沒有
規定哪個元素應該作為文檔元素,因此可以在同一D T D中定義幾個文檔類型。通過這種方
式,各個文檔類型之間可以方便地互相引用。
D T D本身不一定是一個孤立的實體;它可以通過外部參數實體引用其他D T D中的定義,或
者通過條件部分進行參數化,因此它實際上能夠變得非常靈活。遺憾的是,這同時也意味著復
雜性:組織機構常常會發現由于某個D T D過于復雜,而導致其他人無法理解它。
無論選擇哪種方法,都應該盡量保證不同文檔類型的通用性。這意味著要將名稱和地址等
公共部件標準化,將元素和屬性的命名規則標準化,將消息的時間標簽和序號等重要數據標準
化。
本章稍后將進一步討論D T D的設計。
4.2.2 將信息模型映射到XML
在本節中,我們將詳細介紹如何將信息模型的不同部分映射到X M L文檔結構。
1. 表示對象類型
通常,信息模型中的對象類型將轉換為X M L結構中的元素類型。
你可以將對象類型名稱作為元素名稱,或者如果對文檔占用的空間很在意,可以采用對象
類型名稱的縮寫。大多數人都喜歡給元素標記使用短名稱,這不僅僅是為了節省空間,而且因
為它能夠增強X M L的可讀性:或許它能夠避免人們將過多的注意力集中于標記,而忽視了真正
的內容。
對象類型是類型層次的一部分,你能夠選擇從哪一層開始建立X M L元素。舉例來說,如果
d e p o s i t是p a y m e n t的子類,可以將< d e p o s i t >作為元素標記;或者將< p a y m e n t >作為元素標記,并
通過其他方式說明這是一個d e p o s i t,或許可以借助屬性,如: <payment type="deposit">。
使用最特殊的類型( d e p o s i t)的優越性體現在D T D能夠更精確地定義與該元素相關的屬性
和子元素。使用更通用的類型( p a y m e n t)的優越性體現在它從一定程度上簡化了應用程序代碼
的編寫,你不必關心它到底是哪種類型的p a y m e n t。
永遠記住,設計數據結構時不要單純為了程序員編寫第一個應用程序方便。因為當這個程
序壽終正寢后,數據結構仍然會存在很長時間。
2. 表示關系
模型中的某些關系可以利用X M L文檔結構中的元素嵌套表示。顯然,“包含”關系可以通過
這種方式表示,例如: < f o o t n o t e >元素可以嵌套在< c h a p t e r >元素中, < h o t e l >元素可以嵌套在
< r e s o r t >元素中。
第4章數據建模與XML使用93 下載
毫無疑問,一個元素只能被一個父元素包含,因此必須采用其他方式處理模型中其余類型
的關系。實際上,這意味著某種鏈接。
在X M L中,有幾種表示從一個元素到另一個元素的鏈接的方法:
• 可以使用I D和I D R E F屬性。I D屬性包含的值能夠在文檔中唯一標識元素; I D R E F屬性的值
必須與文檔中某個元素的I D相同。因此,I D可以作為關系數據庫中的主關鍵字, I D R E F作
為外部關鍵字。另外,不要忘記I D R E F S數據類型,關系數據庫中沒有直接與之對應的結
構: I D R E F S包含一組以空格分隔的I D R E F值,因此它可以作為一對多關系的“一”端,
或者多對多關系的任何一端。
• 可以使用X P o i n t e r引用。它與H T M L中我們熟悉的H R E F屬性等價。可以通過X P o i n t e r值引
用同一文檔或其他文檔中的元素。
• 可以在X M L文檔中使用應用程序定義的主關鍵字和外部關鍵字,而不對它們進行特殊聲明。
應用程序知道這些值是用于表示關系的,而X M L軟件會將它們視作普通數據。
以上三種方法各有所長。使用I D / I D R E F的主要優勢在于X M L解析器能夠幫助你進行文檔的
有效性驗證。遺憾的是,標準的D O M接口并不提供根據I D尋找元素的方法,但是許多D O M實現
都通過專有的接口彌補了這一缺陷,例如M i c r o s o f t提供了n o d e F r o m I D()方法。X S LT也提供了
使用I D值的機制,但是通過將I D值作為關鍵字訪問元素并不比通過非I D值訪問元素更加有效,
因為它不支持執行更高級的操作。使用I D還有其他局限性,例如,它們在整個文檔中必須是唯
一的(僅僅保證在一個元素類型中的唯一性是不行的),每個元素只能有一個I D屬性,它們必須
遵守X M L名稱的語法規范(這意味著“ 2 3 4”、“I 1 8 / 2 9 6”和“ABC 123”都不是有效的I D)。因
此,這種方法不占有絕對優勢。
在下面的例子中,使用I D是非常合適的。在團體旅游的旅行計劃中,有可選的活動和游覽
項目,但是旅游團中的每個人并非都有相同的選擇。例如,父親母親要去娛樂場所,而小孩要
去動物園。在旅行計劃中,我們將通過以下方式表述這種情況:每名游客都有一個I D值,在游
覽項目中,利用I D R E F S字段列出所有參加該項目的游客,具體代碼如下:
程序清單4 - 2
94使用XML 高級編程
下載
在以上代碼中,我們采用了單向鏈接—從游覽項目到游客。當然,我們也可以使用反向
鏈接,在< t r a v e l e r >元素中設置游覽項目屬性,或者可以使用雙向鏈接。通常,我盡量避免雙向
鏈接,因為它產生的唯一結果就是必須檢查一致性,并確定當出現不吻合的情況時該如何處理。
如果決定使用單向鏈接,無論哪個方向都可以。對于一對多關系,你會本能地在“多”端使用
I D R E F S屬性,因為在關系型表中就是這樣處理外部關鍵字的,但是在“一”端使用I D R E F S屬
性也未嘗不可。
X P o i n t e r引用比I D / I D R E F更加靈活,然而遺憾的是它尚未完全標準化,而且未被廣泛實現。
令人欣慰的是這種局面即將得到改善—X P a t h標準的制定工作接近尾聲,它已經成為W 3 C建議,
它將作為以前的X P o i n t e r語法的替代品。X P o i n t e r的優勢在于它允許從一個文檔到另一個文檔的
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(40)