曝光臺 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
表8 - 8
B o o k I D Ti t l e P a g e s I S B N P r i c e
1 IE5 XML Programmer's Reference 4 8 0 1 - 8 6 1 0 0 1 - 5 7 - 6 $ 4 9 . 9 9
第二個是R e c S u b j C a t e g o r i e s表。
表8 - 9
R e c S u b j C a t e g o r i e s I D B o o k I D C a t e g o r y
1 1 X M L
2 1 Web Publishing
3 1 I n t e r n e t
關(guān)于這些數(shù)據(jù)結(jié)構(gòu),下面幾問題很重要。
1. SQL行具有單一的標(biāo)識符
在我們的樣本表中第一個元素是該表的主關(guān)鍵字。一個設(shè)計完整的S Q L數(shù)據(jù)庫總是為每個表
定義一個主關(guān)鍵字,它唯一地定義了表中的每個記錄。通常主關(guān)鍵字是任意的,一般為系統(tǒng)設(shè)
定的數(shù)字(通過一個序列或其他機制)。相比而言,X M L元素(類似于數(shù)據(jù)庫中的表格)不是用
關(guān)鍵字來定義(不過, X M L提供了一個機制: I D屬性,來控制信息)的。例如,下面X M L中的
文檔是完全可以被接受的:
程序清單8 - 8 9
值得注意的是三個< B e v e r a g e >元素正好具有相同的內(nèi)容。在文檔被解析的時候, X M L可以
根據(jù)它們被遇見的次序區(qū)別開這些元素。這就帶來數(shù)據(jù)庫和X M L之間的第二個區(qū)別。
2. SQL行并不反映順序
關(guān)系型數(shù)據(jù)庫并不反映出表中出現(xiàn)的信息的任何順序。例如,在我們檢驗這些樣本結(jié)構(gòu)之
前,為B o o k設(shè)定了三個“R e c S u b j C a t e g o r i e s”:I n t e r n e t、Web Publishing和X M L。這些類項的主
292使用XML 高級編程
下載
題被用在每本書的背面,用來向書商說明這些書應(yīng)該擺放在書架的哪個地方,在計劃訂貨時可
以被使用。在X M L文檔中,它們被遇見時的順序可以反映一種順序—這本書首先和X M L書籍
最相符,然后作為選擇的是適用關(guān)于網(wǎng)絡(luò)出版的一些信息,如果前面兩種都不適用,則適用于
網(wǎng)絡(luò)書籍。在數(shù)據(jù)庫中對信息進行排序的時候,這些順序信息將會丟失。如果這些信息得以保
持,賦予R e c S u b j C a t e g o r i e s記錄的一些列排序信息將被用來揭示類別的優(yōu)先順序。
我們的查詢語言應(yīng)該了解X M L文檔出現(xiàn)的信息的順序特征,并根據(jù)使用這種語言查詢的任
何結(jié)果來保存信息。而且元素的位置適用于查詢引擎,這樣可以利用那個信息來對結(jié)果進行過
濾—例如,對于給定的< B o o k >元素,查詢引擎能夠返回第二個< C a t e g o r y >元素。
3. SQL結(jié)構(gòu)并不提供層次封裝
從概念上來說,關(guān)系型結(jié)構(gòu)并不是層次性的—在前面的例子中,它并沒有提供給我們對
< B o o k >元素內(nèi)部< RecSubjCategories >元素封裝的方法。相反, < RecSubjCategories >元素必須
含有指回它們所屬元素的指針—在我們的例子中,表< RecSubjCategories >中B o o k I D列就回指
到“含有” R e c S u b j C a t e g o r i e s信息的書記錄。X M L這種指針機制可以讓我們根據(jù)需要定義一對
一或者一對多的引用,甚至超出允許我們選擇指向數(shù)據(jù)庫結(jié)構(gòu)中任意其他的元素。
這些關(guān)于指針的話題會使你想起X M L中的等價物—利用I D R E F或者I D R E F S屬性來回指具
有給定I D的元素。我們可以設(shè)想一個< B o o k >和< RecSubjCategories >的D T D程序段看起來如下
所示:
程序清單8 - 9 0
在這種結(jié)構(gòu)形式下,上面的例子將成為如下所示:
程序清單8 - 9 1
第8章鏈接和查詢使用293 下載
為了找出一本書的類別序列, 我們有必要尋找具有回指該書的B o o k I D 的
< R e c S u b j C a t e g o r i e s >元素。相反,為了找出包含特定類別序列的書籍,我們有必要搜索擁有被
正討論的< R e c S u b j C a t e g o r i e s >元素的B o o k I D s所指向I D(或I D s)的書(或多本書)。關(guān)系型數(shù)據(jù)
庫天生就是利用連接( j o i n)來解決這類問題,能夠使元素之間連接的界限很清晰,而標(biāo)準(zhǔn)的
X M L工具(如D O M或者S A X)的橫向連接需要額外的工作。
如我們所知, X M L允許信息封裝為父親的孩子。這僅典型地用于表達一對一或者一對多的
關(guān)系(把同一個孩子嵌入不止一個的父母中,會造成信息的重復(fù),在X M L文檔中利用I D -
I D R E F S機制進行描述將會好一些)。我們例子的最初版本利用封裝顯示了類別信息是書籍信息
的組成部分。X M L技術(shù),如: D O M、S A X、XLi n k、XPo i n t e r、XPa t h和X S LT利用節(jié)點樹的形
式表達父母-孩子的關(guān)系更加能夠發(fā)揮作用。我們的X M L查詢語言能夠瀏覽父母-孩子關(guān)系和
I D - I D R E F關(guān)系—以任一方向—能夠保存查詢得到的信息。
4. XML混淆了屬性和純文本內(nèi)容
在X M L文檔中,將屬性和帶有自己本身的文本內(nèi)容和純文本內(nèi)容的特定元素相關(guān)聯(lián)是可能
的。下面是兩種可能的情形:
程序清單8 - 9 2
這兩種形式在句法構(gòu)成上是不同的,但從語義上來說是完全相等的—書籍有標(biāo)題,無論
它們是作為書籍的屬性還是作為書籍的純文本子元素。每個樣本的這個信息可以被存儲在以前
定義的B o o k表中:
程序清單8 - 9 3
“文本元素與屬性”的辯論仍在繼續(xù)—有人嘗試為X M L內(nèi)容添加標(biāo)準(zhǔn)的形式(例如
M i c r o s o f t的B i z Ta l k對象的規(guī)范形式可以在網(wǎng)址h t t p : / / w w w. b i z t a l k . o rg/resources/canonical.asp 中
查到),但是W 3 C標(biāo)準(zhǔn)并沒有把X M L文檔限制為一種形式或其他形式。我們的查詢引擎應(yīng)該對
294使用XML 高級編程
下載
兩種情形都能夠進行操作。
5. XML允許元素混合模型
X M L允許元素被定義成具有混合內(nèi)容模型—它們可以包含文本信息和子元素。這里有個
例子:
程序清單8 - 9 4
符合上面規(guī)范的< B o o k >元素應(yīng)該是下面這種形式:
程序清單8 - 9 5
如果考慮對段落進行標(biāo)記,這些需要就變得很明顯了:一些單詞或短語可能是粗體、斜體,
中國航空網(wǎng) www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(101)