国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

用于數(shù)據(jù)的XML:對(duì)XQuery的前瞻

2019-11-18 15:22:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本專(zhuān)欄文章介紹了 xml Query(也稱(chēng)為 XQuery)工作草案的當(dāng)前狀態(tài)。Kevin Williams 演示了如何使用 FLWR(“flower”)子句,介紹了 distinct-values 函數(shù)(該函數(shù)被使用于透視數(shù)據(jù)關(guān)系)并就 XQuery 將如何影響數(shù)據(jù)文檔操作給出了他的評(píng)價(jià)。XQuery 和 XML 的樣本代碼演示了 for、let、where 和 return(FLWR)子句的用法。
假如您曾經(jīng)嘗試過(guò)使用 XSL 進(jìn)行任何形式的復(fù)雜數(shù)據(jù)操作(例如連接兩個(gè)元素集、透視關(guān)系或者甚至相對(duì)簡(jiǎn)單的數(shù)學(xué)計(jì)算),那么您就知道它在數(shù)據(jù)操作的特性方面稍微欠缺了一點(diǎn)。要解決這個(gè)問(wèn)題,樣式表作者們不得不使用書(shū)上的每種訣竅 ? 將多個(gè)樣式表鏈接在一起、對(duì) xsl:for-each 運(yùn)算符進(jìn)行很深的嵌套以及編寫(xiě)令 Perl 專(zhuān)家都頭痛的語(yǔ)法煩瑣的代碼。不用擔(dān)心,馬上就會(huì)得到幫助。即將于 2002 年夏季發(fā)布的 XQuery 規(guī)范將解決所有這些問(wèn)題以及更多其它問(wèn)題。

那么什么是 XML Query?
XML Query,通常縮寫(xiě)為 XQuery,是一種已經(jīng)以這樣或那樣的方式存在幾年的規(guī)范。XML Query 工作組在 1999 年 9 月正式成立,任務(wù)是創(chuàng)建一種靈活的查詢(xún)語(yǔ)言來(lái)從 XML 文檔中抽取數(shù)據(jù)。最新的工作草案(請(qǐng)參閱參考資料)對(duì)實(shí)現(xiàn)這個(gè)目標(biāo)大有幫助。

XQuery 構(gòu)建在 XPath 規(guī)范之上。事實(shí)上,XQuery 的一些特性已公認(rèn)為是非常基本的,以致于它們已被合并入 XPath 2.0 規(guī)范中,而且這個(gè)規(guī)范目前為 W3C 的 XML Query 和 XSL 工作組共同擁有。這是個(gè)好消息,因?yàn)樗馕吨鴺邮奖碜髡邆儗⒑芸炀湍芾孟笮蛄小⒘炕透鼜?qiáng)有力的類(lèi)型控制這樣的特性。同樣,已將條件表達(dá)式和迭代器添加到了 XPath 語(yǔ)言中,而在以前它們是 XSL 語(yǔ)言的一部分。這樣就可以在樣式表中編寫(xiě)更清楚的代碼,并且為樣式表創(chuàng)建者帶來(lái)較少的麻煩。

FLWR 表達(dá)式
XQuery 中最強(qiáng)大的新特性是 FLWR 表達(dá)式。FLWR(發(fā)音為 flower)是 For-Let-Where-Return 的首字母縮略詞,這些子句都答應(yīng)在這些表達(dá)式的任何一個(gè)中。FLWR 表達(dá)式可以完成很多您在 XSL 樣式表中做夢(mèng)都別想完成的任務(wù)。

每個(gè) FLWR 表達(dá)式都有一個(gè)或多個(gè) for 子句、一個(gè)或多個(gè) let 子句、一個(gè)可選的 where 子句以及一個(gè) return 子句。

for 子句
如清單 1 所示,使用 for 子句來(lái)指定一組笛卡爾元組,表達(dá)式的其余部分將對(duì)該元組求值。通過(guò)為這些笛卡爾組選定次序來(lái)控制求值的次序。

清單 1. 單個(gè) for 子句 for $exp1 in (, )

運(yùn)行的程序?qū)?duì)清單 1 中的表達(dá)式進(jìn)行二次求值,其中 $exp 變量分別被設(shè)置為 和 。假如引入了另一個(gè) for 表達(dá)式,那么這個(gè)程序?qū)?duì)笛卡爾積求值。看一下清單 2 中的示例,其中使用了多個(gè) for 子句。

清單 2. 多個(gè) for 子句
for $exp1 in (, )
for $exp2 in (, )

在清單 2 中,程序?qū)?duì)表達(dá)式進(jìn)行四次求值,每次對(duì)一個(gè)元組求值:

(, )
(, )
(, )
(, )

let 子句
let 子句為一個(gè)變量賦一個(gè)值或一個(gè)序列。在 where 或 return 子句中,這可能是非常有用的簡(jiǎn)寫(xiě)。

where 和 return 子句
假如特定的元組不能滿足非凡條件,那么 where 子句命令程序廢棄這些元組。return 子句定義每個(gè)元組要返回的內(nèi)容。

在本示例中,查詢(xún)返回了文檔中已編寫(xiě)了多于三本書(shū)的所有作者的名字。它以一個(gè)示例文檔開(kāi)始,表達(dá)式對(duì)該示例文檔進(jìn)行操作,如清單 3 所示。

清單 3. 示例文檔 authorList.xml


PRofessional XML, 2nd Edition
Professional XML Databases
Professional XML Schemas


Esoteric Topics in Programming, Vol. 1
Esoteric Topics in Programming, Vol. 2



對(duì) authorList.xml 文檔進(jìn)行操作的查詢(xún)?nèi)缜鍐?4 所示。
清單 4. 選擇編寫(xiě)了多于三本書(shū)的作者的樣本查詢(xún)

{
let $inDoc := document("authors.xml")
for $author in ($inDoc//author)
let $cb := count($author/book)
where ($cb >= 3)
return
$author/@name
}


清單 4 中的 XQuery 將返回清單 5 中的內(nèi)容。

清單 5. 對(duì)多產(chǎn)作者查詢(xún)的結(jié)果

Kevin Williams


distinct-values 函數(shù)
XQuery 還引入了一個(gè)在執(zhí)行數(shù)據(jù)操作時(shí)會(huì)給您帶來(lái)很多方便的函數(shù):distinct-values 函數(shù)(在 XPath 2.0 中也有)。這個(gè)函數(shù)答應(yīng)您方便地透視文檔中的關(guān)系。例如,假設(shè)您有一個(gè)您的軟件公司的客戶(hù)和他們已購(gòu)產(chǎn)品的列表,如清單 6 所示。

清單 6. 樣本客戶(hù)數(shù)據(jù),customerList.xml











假如您想將這個(gè)文檔轉(zhuǎn)換為一個(gè)列出所有產(chǎn)品以及每個(gè)產(chǎn)品的客戶(hù)列表的文檔,那么您手頭可有活干了。完成這樣的工作是可能的,但是編碼卻非常煩瑣。而通過(guò)使用 XQuery,問(wèn)題就變得非常簡(jiǎn)單,如清單 7 所示。

清單 7. 透視客戶(hù)-產(chǎn)品關(guān)系的代碼

{
let $inDoc := document("customerList.xml")
for $product in distinct-values("$input//customer/product/@name)
return

{
for $customer in $input//customer
where $customer/product/@name = $product
return

}

}


清單 7 將產(chǎn)生清單 8 所示的輸出。

清單 8. 轉(zhuǎn)換代碼的結(jié)果













強(qiáng)大、易于使用和易于理解:XQuery 使那種數(shù)據(jù)操作變得簡(jiǎn)單。

應(yīng)該何時(shí)使用 XQuery?
何時(shí)開(kāi)始使用 XQuery 才是明智的取決于您何時(shí)閱讀本專(zhuān)欄以及您是否十分渴望開(kāi)始使用一種新規(guī)范。到 2002 ?2 月為止,這個(gè)規(guī)范還處于“工作草案(Working Draft)”狀態(tài),這意味著從現(xiàn)在開(kāi)始到它發(fā)行的這段時(shí)間內(nèi),可能還會(huì)對(duì)它進(jìn)行重大的更改。一旦它進(jìn)入“推薦的建議書(shū)(Proposed Recommendation)”狀態(tài),通常就認(rèn)為它很穩(wěn)定,足以經(jīng)受考驗(yàn)了 ? 事實(shí)上,W3C 鼓勵(lì)開(kāi)發(fā)人員在這時(shí)使用各種規(guī)范,那么當(dāng)新規(guī)范進(jìn)入“建議書(shū)(Recommendation)”狀態(tài)之前,可以獲取反饋信息,從而進(jìn)一步修改規(guī)范,使之更趨完善。假如您認(rèn)為該規(guī)范將帶來(lái)非常多的好處,以致于當(dāng)它一進(jìn)入“推薦的建議書(shū)”狀態(tài),您就想嘗試使用它,那么 2002 年春季將是了解這個(gè)規(guī)范的好時(shí)機(jī)。

無(wú)論何時(shí)您覺(jué)得 XQuery 對(duì)您來(lái)說(shuō)可能是個(gè)可行的解決方案時(shí),您都應(yīng)當(dāng)記住以下幾條準(zhǔn)則,以判定 XQuery 何時(shí)應(yīng)該成為您解決方案的一個(gè)適當(dāng)部分。

首先,XQuery 不是一粒魔彈。盡管依照句法來(lái)說(shuō),它在數(shù)據(jù)操作上比 XSL 要好用得多(它還支持許多 XSL 不直接支持的操作),但是其底層的引擎還是必須讀取每篇文檔、解析它,然后使用查詢(xún)語(yǔ)言對(duì)它操作。因此,對(duì)于已建立索引的文檔資源庫(kù)(即所謂的 XML“數(shù)據(jù)庫(kù)”),XQuery 是快速訪問(wèn)文檔具體內(nèi)容的好的解決方案,但是對(duì)于未建立索引的文檔,它不是一個(gè)好的解決方案。

其次,XQuery 包含一些用來(lái)訪問(wèn)資源庫(kù)中多個(gè)文檔的機(jī)制。這個(gè)文檔函數(shù)答應(yīng)您以編程方式在同一個(gè)查詢(xún)中訪問(wèn)多個(gè)文檔。但是,相同的問(wèn)題出現(xiàn)了:您仍需要裝入并解析每個(gè)文檔。因此,要達(dá)到最佳性能,您最好還是使用 XML 數(shù)據(jù)庫(kù)或一些其它形式的索引模型。

最后,XQuery 最擅優(yōu)點(diǎn)理“混合”文檔 ? 同時(shí)包含敘述流和量化數(shù)據(jù)的文檔。例如,一個(gè)醫(yī)療記錄文檔可能包含手術(shù)期間外科醫(yī)生操作的描述,以及手術(shù)期間使用的藥物、血和其它物品的數(shù)量。該文檔不適合存儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中,但是,XQuery 卻非常擅長(zhǎng)此道,它能直接從該 XML 文檔中抽取出量化信息。但是,假如您的文檔是純數(shù)據(jù),那么將該文檔引入到關(guān)系型數(shù)據(jù)庫(kù)中進(jìn)行操作會(huì)更有意義。

結(jié)束語(yǔ)
XQuery 為 XML 文檔中的數(shù)據(jù)操作提供了一種強(qiáng)大的語(yǔ)法。它最適合于那些同時(shí)包含敘述性文本和量化數(shù)據(jù)的文檔。在對(duì)這些類(lèi)型的文檔上使用 XQuery 時(shí),為達(dá)到最佳性能,可以將這些文檔裝入一些已建立索引的 XML 資源庫(kù)中。

W3C 是否會(huì)在夏季發(fā)布規(guī)范還有待觀察;目前有許多未解決的重大問(wèn)題,包括在 XPath 2.0 表達(dá)式中是否應(yīng)該有保留字。幾乎可以肯定的是,解決這些問(wèn)題是要花一些時(shí)間的。但是,現(xiàn)在知道了對(duì)文檔的需求可以使您在這種技術(shù)廣泛可用時(shí),最大程度地利用這種技術(shù)。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长寿区| 江川县| 揭西县| 姜堰市| 扎囊县| 南投市| 磴口县| 枣阳市| 高邑县| 新河县| 积石山| 马鞍山市| 临沧市| 聂荣县| 农安县| 米脂县| 贺州市| 东台市| 广西| 彭州市| 杭锦旗| 兴仁县| 淮滨县| 巴彦县| 惠东县| 林芝县| 甘谷县| 桃园市| 昆山市| 惠安县| 仁怀市| 德江县| 霍林郭勒市| 育儿| 禄劝| 胶南市| 马山县| 五指山市| 台北县| 梁河县| 梁河县|