曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
交叉引用,雖然你需要知道目標文檔的詳細結構。X P o i n t e r不需要在D T D中標識,因此解析器不
會驗證它的有效性。如果你選擇直接支持X P o i n t e r值的X M L軟件,可以考慮利用它實現鏈接,
然而或許它僅僅是一種我們應該密切監視的未來的技術,它在目前的環境下并不是真正實用的。
顯而易見,最簡單的X P o i n t e r是U R L,只要有理由使用獨立的文檔保存數據,使用U R L表示
關系就是非常值得的。
假設我們的旅游公司負責組織一次會議。會議的一項安排是為每個與會代表安排單獨的出
游路線。因此,應該為會議建立一個X M L文檔,并且分別為每個代表的路線建立一個X M L文檔。
例如:
程序清單4 - 3
現在,我們只能鏈接到X M L文檔,一旦X P o i n t e r規范標準化,就能夠鏈接到文檔中的某個
元素。例如,旅館的所有菜單應該位于一個文檔中,每個代表選擇的菜單應該是指向各個菜單
的X P o i n t e r。
另外,利用應用程序級的關鍵字處理關系也是一種非?尚械姆椒ǎ峁┝俗畲蟮撵`活
第4章數據建模與XML使用95 下載
性,你可以采用任何有效的方式對關系進行操作。唯一的缺陷是X M L解析器不能為你提供任何
幫助。借助X S LT樣式表中的k e y ( )函數,能夠以非常直接的方式處理通過這種方法實現的關系。
要了解更多有關鏈接的信息,參見第8章。
3. 表示屬性
當你在信息模型中標識了特性之后,就出現了一種經典的進退兩難的局面:在X M L文檔中,
你應該使用X M L屬性表示它,還是使用嵌套的(子)元素表示它?一旦做出決定,還有其他因
素需要考慮。
元素還是屬性
在下面的例子中,書的特性表示為X M L屬性:
程序清單4 - 4
對于相同的信息,下面的例子將特性表示為子元素:
程序清單4 - 5
哪種表示方法更好?這是常常令首次設計X M L文檔的人感到困惑的一個問題,雖然有人會
回答“無所謂,它們沒什么區別”,但是這個問題的確值得詳細探討,通過我們的分析,你將能
夠根據實際情況權衡利弊。然而,需要提前說明的是,即使專家在這方面也不能達成一致意見,
而且有時他們會產生嚴重的分歧。
首先,讓我們看看如何從哲學角度分析到底應該選擇哪種方法。有人認為子元素代表被包
含的對象—它有自己的存在和獨立于容器的標識—而屬性代表與對象相關聯的值,它沒有
自己獨立的生命。這種論點的含義非常深刻,如果你準備沿著這條路線走下去,最好在與別人
爭論之前先研讀一下亞里士多德的論著。依據這種邏輯,你最終會決定將a g e表示為屬性,而將
p l a c e - o f - b i r t h表示為子元素(因為地點是個有自己權利的對象)。這種思路產生的結果不太直觀,
而且也不是非常有幫助,它會使你陷入對每個特性徒勞的爭論中。
另一種推理路線是揣摩X M L標準設計者的意圖。早在S G M L中就已經存在子元素和屬性之
間的區別了,因此我們可以問這樣一個明顯的問題:最初的S G M L設計者如何看待這兩種結構的
角色呢?
正如我們所知,S G M L最初是作為一種標記語言為發行提供文本。后來,其他應用程序也將
它作為通用的數據交換格式。從標記語言角度考慮, S G M L中的內容(最終用戶將在頁面上看到
96使用XML 高級編程
下載
的文本)和元數據(有關內容的信息,它是供執行各種處理操作的軟件使用的)有著明顯的區
別。簡單來說,內容是用元素標記中的文本表示的,元數據是用屬性表示的。這種差別一直保
持到H T M L中,而且在H T M L的發展過程中引起了許多問題:例如客戶端J a v a S c r i p t部分不能作
為屬性被正確處理,因此要將它們放置在< s c r i p t >元素中;但是由于不希望用戶看到這些代碼,
因此要將它們注釋掉—這簡直是濫用注釋。
所以,S G M L中元素內容和屬性之間的差別從本質上體現在信息用途上的差異:元素內容是
供文檔的讀者使用的,屬性是供印刷商或他們的軟件使用的。當然,一旦將S G M L或X M L用于
軟件系統之間的數據交換,這種差別就喪失了意義。即使有人類讀者,例如電子表格,決定哪
些供軟件使用,哪些供用戶使用也是很困難的。
綜上所述,回顧歷史并不能使我們得到正確的答案。所以,我們能夠得出這樣的結論:只
要從實用角度考慮,你可以自由選擇使用元素或屬性。
下面我們將從正反兩方面分析一下這兩種方法(參見表4 - 1)。
表4 - 1
優點缺點
X M L屬性D T D能夠對值進行約束: 如果只允許有限只支持簡單的字符串值
的幾個值,例如:“y e s”和“n o”,使用屬
性非常有效不支持元數據(即“屬性的屬性”)
D T D能夠定義缺省值
驗證I D和I D R E F的有效性無序
占用較少的空間(當你通過網絡發送幾
千兆字節的數據時,它的優勢非常明顯)
對于某些數據類型(例如, N M TO K E N S),
能夠進行空白的規格化,它能夠減輕應用
程序解析的壓力
便于使用D O M和S A X接口進行處理
能夠訪問未解析外部實體,例如:
二進制數據
子元素支持任意復雜的值和重復的值。空間占用率略高
有序
支持“屬性的屬性” 編程比較復雜
當數據模型改變時,子元素可擴展
至于如何權衡這些因素,取決于應用程序的實際情況。許多有經驗的設計者認為最重要的
因素是變化的潛力:隨著應用程序的發展,是否能夠擴展文檔或消息格式。這一因素使得子元
素優于屬性,因為實際應用中最常見的變化是將一個簡單的特性(例如:“作者”)擴展為復雜
的結構化特性(例如:作者列表,其中每一項都由姓和名標識)。但是對于你的應用程序來說,
這是否是正確的選擇,只有你自己才能決定。值得一提的是,最初由M i c r o s o f t發起的B i z t a l k提
出了截然相反的建議,它們認為屬性更加可取,因此你應該根據實際情況來決定。
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(41)