用於資料的XML 對XQuery的前瞻

2021-04-17 21:18:10 字數 3740 閱讀 2322

xquery 工作草案以及它如何應用到用於資料的 xml 中的回顧 kevin williams([email protected]) 首席執行官,blue oxide technologies, llc 2002 年 2 月 本專欄文章介紹了 xml query(也稱為 xquery)工作草案的當前狀態。kevin williams 演示了如何使用 flwr(「flower」)子句,介紹了 distinct-values 函式(該函式被使用於透視資料關係)並就 xquery 將如何影響資料文件操作給出了他的評價。xquery 和 xml 的樣本**演示了 for、let、where 和 return(flwr)子句的用法。 如果您曾經嘗試過使用 xsl 進行任何形式的複雜資料操作(例如連線兩個元素集、透視關係或者甚至相對簡單的數學計算),那麼您就知道它在資料操作的特性方面稍微欠缺了一點。要解決這個問題,樣式表作者們不得不使用書上的每種訣竅 — 將多個樣式表鏈結在一起、對 xsl:for-each 運算子進行很深的巢狀以及編寫令 perl 專家都頭痛的語法煩瑣的**。不用擔心,馬上就會得到幫助。即將於 2002 年夏季發布的 xquery 規範將解決所有這些問題以及更多其它問題。 那麼什麼是 xml query? xml query,通常縮寫為 xquery,是一種已經以這樣或那樣的方式存在幾年的規範。xml query 工作組在 1999 年 9 月正式成立,任務是建立一種靈活的查詢語言來從 xml 文件中抽取資料。最新的工作草案(請參閱參考資料)對實現這個目標大有幫助。 xquery 構建在 xpath 規範之上。事實上,xquery 的一些特性已公認為是非常基本的,以致於它們已被合併入 xpath 2.0 規範中,而且這個規範目前為 w3c 的 xml query 和 xsl 工作組共同擁有。這是個好訊息,因為它意味著樣式表作者們將很快就能利用象序列、量化和更強有力的型別控制這樣的特性。同樣,已將條件表示式和迭代器新增到了 xpath 語言中,而在以前它們是 xsl 語言的一部分。這樣就可以在樣式表中編寫更清晰的**,並且為樣式表建立者帶來較少的麻煩。 flwr 表示式 xquery 中最強大的新特性是 flwr 表示式。flwr(發音為 flower)是 for-let-where-return 的首字母縮略詞,這些子句都允許在這些表示式的任何乙個中。flwr 表示式可以完成很多您在 xsl 樣式表中做夢都別想完成的任務。 每個 flwr 表示式都有乙個或多個 for 子句、乙個或多個 let 子句、乙個可選的 where 子句以及乙個 return 子句。 for 子句 如清單 1 所示,使用 for 子句來指定一組笛卡爾元組,表示式的其餘部分將對該元組求值。通過為這些笛卡爾組選定次序來控制求值的次序。 清單 1. 單個 for 子句 for $exp1 in (

,) 執行的程式將對清單 1 中的表示式進行二次求值,其中 $exp 變數分別被設定為

。如果引入了另乙個 for 表示式,那麼這個程式將對笛卡爾積求值。看一下清單 2 中的示例,其中使用了多個 for 子句。 清單 2. 多個 for 子句 for $exp1 in (

,) for $exp2 in (

, ) 在清單 2 中,程式將對表示式進行四次求值,每次對乙個元組求值: (

, ) (

, ) (,

) (,

) let 子句 let 子句為乙個變數賦乙個值或乙個序列。在 where 或 return 子句中,這可能是非常有用的簡寫。 where 和 return 子句 如果特定的元組不能滿足特殊條件,那麼 where 子句命令程式廢棄這些元組。return 子句定義每個元組要返回的內容。 在本示例中,查詢返回了文件中已編寫了多於三本書的所有作者的名字。它以乙個示例文件開始,表示式對該示例文件進行操作,如清單 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

對 authorlist.xml 文件進行操作的查詢如清單 4 所示。 清單 4. 選擇編寫了多於三本書的作者的樣本查詢

清單 4 中的 xquery 將返回清單 5 中的內容。 清單 5. 對多產作者查詢的結果

kevin williams

distinct-values 函式 xquery 還引入了乙個在執行資料操作時會給您帶來很多方便的函式:distinct-values 函式(在 xpath 2.0 中也有)。這個函式允許您方便地透視文件中的關係。例如,假設您有乙個您的軟體公司的客戶和他們已購產品的列表,如清單 6 所示。 清單 6. 樣本客戶資料,customerlist.xml

如果您想將這個文件轉換為乙個列出所有產品以及每個產品的客戶列表的文件,那麼您手頭可有活幹了。完成這樣的工作是可能的,但是編碼卻非常煩瑣。而通過使用 xquery,問題就變得非常簡單,如清單 7 所示。 清單 7. 透視客戶-產品關係的**

} 清單 7 將產生清單 8 所示的輸出。 清單 8. 轉換**的結果

強大、易於使用和易於理解:xquery 使那種資料操作變得簡單。 應該何時使用 xquery? 何時開始使用 xquery 才是明智的取決於您何時閱讀本專欄以及您是否十分渴望開始使用一種新規範。到 2002 ?2 月為止,這個規範還處於「工作草案(working draft)」狀態,這意味著從現在開始到它發行的這段時間內,可能還會對它進行重大的更改。一旦它進入「推薦的建議書(proposed recommendation)」狀態,通常就認為它很穩定,足以經受考驗了 — 事實上,w3c 鼓勵開發人員在這時使用各種規範,那麼當新規範進入「建議書(recommendation)」狀態之前,可以獲取反饋資訊,從而進一步修改規範,使之更趨完善。如果您認為該規範將帶來非常多的好處,以致於當它一進入「推薦的建議書」狀態,您就想嘗試使用它,那麼 2002 年春季將是了解這個規範的好時機。 無論何時您覺得 xquery 對您來說可能是個可行的解決方案時,您都應當記住以下幾條準則,以判斷 xquery 何時應該成為您解決方案的乙個適當部分。 首先,xquery 不是一粒魔彈。儘管依照句法來說,它在資料操作上比 xsl 要好用得多(它還支援許多 xsl 不直接支援的操作),但是其底層的引擎還是必須讀取每篇文件、解析它,然後使用查詢語言對它操作。因此,對於已建立索引的文件資源庫(即所謂的 xml「資料庫」),xquery 是快速訪問文件具體內容的好的解決方案,但是對於未建立索引的文件,它不是乙個好的解決方案。 其次,xquery 包含一些用來訪問資源庫中多個文件的機制。這個文件函式允許您以程式設計方式在同乙個查詢中訪問多個文件。但是,相同的問題出現了:您仍需要裝入並解析每個文件。因此,要達到最佳效能,您最好還是使用 xml 資料庫或一些其它形式的索引模型。 最後,xquery 最擅長處理「混合」文件 — 同時包含敘述流和量化資料的文件。例如,乙個醫療記錄文件可能包含手術期間外科醫生操作的描述,以及手術期間使用的藥物、血和其它物品的數量。該文件不適合儲存在關係型資料庫中,但是,xquery 卻非常擅長此道,它能直接從該 xml 文件中抽取出量化資訊。但是,如果您的文件是純資料,那麼將該文件引入到關係型資料庫中進行操作會更有意義。 結束語 xquery 為 xml 文件中的資料操作提供了一種強大的語法。它最適合於那些同時包含敘述性文字和量化資料的文件。在對這些型別的文件上使用 xquery 時,為達到最佳效能,可以將這些文件裝入一些已建立索引的 xml 資源庫中。 w3c 是否會在夏季發布規範還有待觀察;目前有許多未解決的重大問題,包括在 xpath 2.0 表示式中是否應該有保留字。幾乎可以肯定的是,解決這些問題是要花一些時間的。但是,現在知道了對文件的需求可以使您在這種技術廣泛可用時,最大程度地利用這種技術。

XML 對XML的認識

xml 應用於 web 開發的許多方面,常用於簡化資料的儲存和共享。xml把資料從 html 分離 xml 簡化資料共享 xml 簡化資料傳輸 xml 簡化平台變更 xml 使您的資料更有用 xml 用於建立新的網際網路語言 tove jani reminder don t forget me th...

php對xml資料迴圈遍歷

string 優酷網 www.youku.com 唱說天下 銀幕上 不搭配 的情侶檔 娛樂 娛樂諮詢 xml xml load string string 將xml字串轉化為 xmlelement物件 array json decode json encode xml true 轉化為php陣列 遍...

用於處理XML文件的DOM元素屬性

childnodes 返回當前元素所有子元素的陣列 firstchild 返回當前元素第乙個下級子元素 lastchild 返回當前元素的最後乙個子元素 nextsibling 返回緊跟在當前後面的 元素 nodevalue 指定表示元素值的讀寫屬性 parentnode 返回元素的父節點 prev...