曝光臺 注意防騙
網(wǎng)曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
將返回下面的節(jié)點:
作為一個X M L文檔它是無效的,因為沒有根節(jié)點—或一個以上的根節(jié)點,看你是怎么看
了!
然而,我們可以像以前一樣簡單地用一個< A u t h o r s >節(jié)點包裝每件東西,因為結(jié)果不一定是
作者。以前的查詢用< A u t h o r s >包裝后看上去將是:
程序清單1 0 - 2 4
它將打亂我們的D T D或模式,因為< L a s t N a m e >只能作為< A u t h o r >的子節(jié)點而不是
< A u t h o r s >的。當(dāng)然可以說結(jié)果只能返回作者,并且只能將結(jié)果放在一個< A u t h o r s >元素里,但
是這將極大地降低了腳本的靈活性。例如,如果有人想列出在數(shù)據(jù)庫中所有圖片的引用列表,
那樣他們就可以創(chuàng)建一個肖像長廊,他們可能使用如下的查詢:
這個查詢要求我們的服務(wù)器查找所有的< P o r t r a i t >元素,元素要有p i c L i n k的屬性,它被賦了
一些值,那就是,它是非空的。另外,每個返回的< P o r t r a i t >元素必須是< A u t h o r >元素的子元素,
< A u t h o r >元素必須是< A u t h o r s >元素的子元素。那個查詢可能返回下面的結(jié)果:
程序清單1 0 - 2 5
第10章XML和數(shù)據(jù)庫使用385 下載
如果不將它包裝在< A u t h o r s >里,并且不能僅僅創(chuàng)建像希望中的新的如< L a s t N a m e >和
< P o r t r a i t s >這樣的包含元素(因為它們也會校驗失敗),然后可能會考慮用一般的元素來進行包
裝。例如,可以設(shè)計自己的包容器,并且也許在它的里面包括對到達(dá)的信息應(yīng)如何返回的信息:
程序清單1 0 - 2 6
甚至可以更進一步,加入時間戳和其他的信息,用來輔助處理查詢結(jié)果。在下一部分,我
們將簡要地看一下關(guān)于一些包裝數(shù)據(jù)的方法。現(xiàn)在只能返回所要求的數(shù)據(jù)—例如,可能有多
于一個的元素在文檔的根。讓我們完成腳本,把X S L查詢結(jié)果寫出來:
程序清單1 0 - 2 7
注意這次使用了循環(huán)。因為可能有一些頂級的節(jié)點,需要在結(jié)果節(jié)點列表中循環(huán),為每一
個節(jié)點輸出X M L,要好于簡單地把整棵樹輸出成為X M L。
3. 優(yōu)化
在前面所勾勒出的技術(shù)相當(dāng)?shù)托АT诎l(fā)覺只想要其中的一個之前,它要求我們讀出所有的
作者。在我們這個簡單的例子中,它不是一個很大的處理,但是在一個有著成千上萬記錄的數(shù)
據(jù)庫中可能會很慢。
為了提高效率,應(yīng)該利用其下的數(shù)據(jù)庫的查詢能力,并且使用X S LT和X P a t h的能力來合并
它們。假設(shè)想主要考查關(guān)系數(shù)據(jù)庫,我們將快速地看一下X P a t h語句是如何被映射成S Q L語句。
例如:
要求所有叫M I的作者。這個可以直接被映射為:
選擇一個單個的作者應(yīng)該是:
將被映射成:
X P a t h也允許根據(jù)樹中其他部分的節(jié)點的值來選擇節(jié)點。例如,使用第7章的書目錄模式,
386使用XML 高級編程
下載
如果你想選擇所有的書,這些書與一個特別的出版商相關(guān)聯(lián),則需要下面的X P a t h查詢:
這個意思是說,我們需要所有的< B o o k >元素,把它的i m p r i n t / @ I D設(shè)成與< P u b l i s h e r >的
< C o r p o r a t e N a m e >為“ Wrox Press Ltd. ” 下的< I m p r i n t s >元素下的< I m p r i n t >元素的
s h o r t I m p r i n t N a m e屬性一樣的值。
在S Q L中模擬分級的語句是很直接的。我們可以使用簡單地連接語句來得到父/子關(guān)系,所
以/ C a t a l o g / B o o k將變成:
請求的指定出版商的查詢部分為:
也不是很困難:
程序清單1 0 - 2 8
(假設(shè)我們知道文本元素< C o r p o r a t e N a m e >已經(jīng)被存在一列而不是表中了。我們可以在后面
看到。)
在C a t a l o g / B o o k上的過濾很困難。為了做到這一點,我們需要介紹關(guān)于S E L E C T語句的另一
個方面—子查詢。子查詢允許查詢結(jié)果被用作值的列表用于檢查另一個查詢。在我們的例子
中,想創(chuàng)建一個所有s h o r t I m p r i n t N a m e值的列表,并且查看哪一個與i m p r i n t元素的I D這個值相匹
配,在使用那個列表查找引用i m p r i n t的書之前。我們可以如下實現(xiàn):
程序清單1 0 - 2 9
請注意,我已經(jīng)方便地優(yōu)化了在以前建立的用來只選擇一個出版商的其他過濾器。然而,
我確信你可以看出,用S Q L查詢來模擬X P a t h查詢是可能的。但是存在兩個問題。第一個就是
X P a t h仍然不是一個標(biāo)準(zhǔn),所以現(xiàn)在你所寫的可能會改變。第二個就是你需要分析X P a t h語句,
并且能夠理解整個語法。這些問題如何被完全解決還不是很清楚,但是我們可以看到X P a t h解析
第10章XML和數(shù)據(jù)庫使用387 下載
器的出現(xiàn)是位于特別數(shù)據(jù)庫層的頂端,就像O D B C站在不同低層數(shù)據(jù)存儲格式的頂端一樣。
10.2.3 結(jié)論
X M L提供了一個相當(dāng)強大的在不同數(shù)據(jù)間交換數(shù)據(jù)的方法。這個對于數(shù)據(jù)庫特別有用,因
為在不同類型數(shù)據(jù)間發(fā)生的數(shù)據(jù)相互交換是相當(dāng)困難的。
盡管數(shù)據(jù)可以以一種普通的格式被表示,并沒有什么用于取回的可以接受的標(biāo)準(zhǔn)。盡管不
像我們希望地那樣靈活,用X P a t h指定查詢說明了使用標(biāo)準(zhǔn)查詢語法的潛力。
10.2.4 你可能需要的標(biāo)準(zhǔn)
我們已經(jīng)討論了用于選擇X M L數(shù)據(jù)的不同可能的查詢語法。對于查詢標(biāo)準(zhǔn)的問題,我們也
討論了如何返回數(shù)據(jù)結(jié)果的論點。提出幾個標(biāo)準(zhǔn)指示應(yīng)該如何去做。
1. 片段數(shù)據(jù)交換
最簡單和可能最有效的是片段數(shù)據(jù)交換建議,在h t t p : / / w w w. w 3 . o rg / T R / W D - x m l - f r a g m e n t。
這個提議提供了一種機制,通過對它的松散的節(jié)點給出一些上下文。在第8章我們已經(jīng)看到了這
一點,但是現(xiàn)在拿來在這里使用,并且看一個例子:取出一個作者的傳記。我們在前面所寫的
代碼允許使用下面的語法:
來取回:
程序清單1 0 - 3 0
片段數(shù)據(jù)交換的提議建議,應(yīng)創(chuàng)建一個提供上下文的分離的文檔:
中國航空網(wǎng) m.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(127)