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