蔡可訓
摘要:當愈來愈多的數據資料以XML為標準格式進行存儲時,由于其格式的不同而導致傳統的數據庫及查詢語法無法適用,該文分析了一種全新的XML查詢語言XQuery,并對其在相關領域的應用作了介紹和比較。最后,對XQuery的發展前景作出展望。
關鍵詞:XQuery;XML;XML查詢語言
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2009)34-9640-04
Analysis and Research of XQuery on XML query
CAI Ke-xun
(ZhenJiang Price Bureau, ZhenJiang 212001, China)
Abstract: A new XML query language, XQuery is analyzed in this paper, and its applications in relational fields are also introduced and compared. Development of XQuery is prospected in the end.
Key words: XQuery; XML; XML query language
隨著電子商務的蓬勃興起和WEB應用的日益廣泛,為克服HTML固有的表達局限性,同樣源自于SGML(Standard Generalized Markup Language)標準通用標記語言的一個精簡子集XML應運而生。自萬維網聯合組織W3C(World Wide Web Consortium)于1998年完成XML標準制訂以來,XML迅速成為第二代WEB應用的基礎,獲得了業界所有大型公司(如IBM及微軟等)的全面支持。XML允許信息提供者根據需要自行定義標記及屬性名,其良好的數據存儲格式及可擴展性使之迅速得到了廣泛的應用。
當愈來愈多的數據資料以XML為標準格式進行存儲時,由于其格式的不同而導致傳統的數據庫及查詢語法無法適用,如何以高效快捷的方式實現文件資料的轉換與提取,成為XML發展的又一個重要方面。從2000年1月起W3C開始著手擬訂一種XML數據庫查詢語言XQuery,該語言可實現條件查詢、排序、連結、篩選、分類匯總等數據操作,具有條件表達式、分支語句、循環語句及排序子句等,還提供了一系列可用于求和、求平均數等運算的內置函數,這種語言利用了XPath的路徑表達式實現對XML中的節點定位,無疑,這一標準一旦形成W3C正式建議,則將會對XML的進一步發展帶來深遠的影響。本文將就此查詢語言作一分析探討。
1 XML及其相關標準的概述
XML包含有三個要素:文檔類型定義DTD(Document Type Definition)或XML大綱(XML Schema)、可擴展樣式語言XSL(eXtensible Stylesheet Language)和可擴展鏈接語言XLL(eXtensible Link Language)。其中DTD及XML Schema定義了XML文件中的元素、元素的屬性及元素與元素屬性之間的關系并規定了XML文件的邏輯結構;XSL使數據與其表現形式相互獨立;XLL描述了資源之間如何鏈接,可以從不同的方向進行遍歷,并可將鏈接存儲在獨立于引用文檔的數據庫中。
W3C為XML制定了三個技術規范[1]:XSLT(XSL Transformations)、DOM(Document Object Model)和XPath(XML Path Language),其中XSLT的作用是將某種結構的XML文件轉換為另一種結構的XML文檔(含HTML文檔);DOM則提供了一種功能強大的編程接口,使應用程序能夠訪問和更新XML文檔的樣式、結構及內容,這由支持DOM的解釋器來實現,將可得到一個包含XML文檔中所有元素的樹狀結構;XPath定義了一些可對XML文檔中的數據進行“尋址”的表達式,其操作對象是XML樹狀結構中的節點,其中最重要的表達式稱為“定位路徑”(Location Path),在微軟的msxml及IBM的xalan這兩個支持XPath的軟件系統中其運算對象是DOM的 文檔(Document)或節點(Node)。
這三者的典型應用關系可簡述如下:利用XPath檢索存放數據的XML DOM,得到需要查詢的數據子集,進而利用DOM提供的接口控制XSLT中的模板,將檢索出來的數據按照適當的方式顯示在用戶瀏覽器窗口內,另外,可以利用XPath尋址XML和XSLT DOM中的節點,然后通過DOM提供的編程接口對XML中的數據和XSLT模板中的參數進行動態修改[2]。
2 XQuery查詢語言發展狀況
XML的發展趨勢將成為互聯網上的通用數據庫,實現平臺無關化,且不依賴于機器類型,其數據結構的開放性使得數據的查詢檢索成為一個極其重要的領域。上述以XPath及DOM等為基礎的應用還僅是一種初步的方法,尤其是DOM節點與XPath節點之間的一些不一致問題還有待解決。隨著用XML存儲、交換和表述信息的應用日益增多,人們對其研究也越來越深入,如何從XML數據源中準確有效地獲取所需信息,也就變得越來越重要。目前已有的查詢語言如XQL、XML QL、QUILT、XML GL、XPath、QOL、YATL、Lorel等一般具有較強的針對性,往往只適用于某種或少數幾種數據類型的查詢,為了適應XML的發展需求,XML通用查詢語言的制定工作顯得關鍵而重要。
W3C于2000年1月公布了第一版XML查詢語言需求草案文件(XML Query Requirements W3C Working Draft),對XML的查詢語言本身及XML查詢數據模板、表示法的發展方向及使用環境等進行了規范,其制定原則是構建于W3C發展中的另一個標準規范XML Infoset之上并支持命名空間(Namespaces)的應用。它規定了查詢的應用范圍不應只限于單一的XML文檔內,且應可基于文件的內容及結構對查詢條件作出定義,從而實現在整個文件或部分內容中進行檢索的目的,最終要求查詢的結果可根據用戶需求自動構造成新的XML文檔[3]。目前該語言的最新版本是2002年11月15日發布的Xquery草案。
國際標準組織W3C的XML Query工作小組及XSL工作小組最近于2003年2月14日為XML的全文檢索工作發布了兩份草案文件,分別為XQuery and XPath Full-Text Requirements和XQuery and XPath Full-Text Use Cases。前者明確提出全文檢索需能夠處理XQuery/XPath文檔模型中的示例且無須設計成類客戶端的界面語言,若Xquery/Xpath Full-Text支持查詢元素與屬性名時,應能對元素內容、屬性值等進行區分[4];后者則闡述了全文檢索的實際應用,以范例形式說明了全文檢索的各個功能。這一切牽涉到以全文標記化(tokenized)方法對XQuery和Xpath語言的擴充,基本機理是將一段文字逐字、逐標點地分成若干個標記(token),從而使相關位置上的單字能夠參與檢索運算,這樣不僅能實現鄰近單字的查找,而且還能對其它字元及字根的使用進行處理[5]。
3 XQuery分析及應用比較
3.1 XQuery描述
XQuery由Quilt所衍生而來,同時又從XPath和XQL中吸收了路徑表示語法以適應層次結構文檔的需要,融入了SQL中基于關鍵字系列子句的思想,為數據重建提供了類SQL的Select From Where模式,并吸取了OQL中由幾種不同表達式全嵌套組成的功能語言概念。XQuery作為一種將查詢表示成表達式的功能語言,可以完全嵌套,故而沿用了子查詢的功能與用法。
XQuery語言的組成單位可稱為查詢模塊(query modules),模塊之間相互獨立但多個模塊可以用分號隔開同時使用并被合法解析,以下是XQuery中的表達式組成體系:
1) 主要表達式(Primary Expressions):這是XQuery的基本單元,包括有字符、變量、函數調用及決定優先級的括弧使用,其中一個URL字符在定義上等價于一個字符串。
2) 路徑表達式(Path Expressions):其語法基于Xpath 1.0,這是一種以路徑方式瀏覽XML文件的標記法,在路徑表達式的開始處可指定文件中的一個特定節點或一個包含有其他子節點的父節點,再按照文件結構配合以XPath的語法以尋找出符合檢索路徑的數據。例如:document(“myxml.xml”)//chapter[2]//figure[caption=“SearchThisData”]。
首先是找到myxml.xml文件中的根結點,然后查找根節點內的第二個chapter子結點,最后檢索出此chapter子結點中包含有caption元素且其值為SearchThisData的figure子結點。
3) 序列表達式(Sequence Expressions):XQuery支持結構化運算及組合序列,序列指零或其他項目的有序集合,其中一個項目允許是一個單位值或一個節點。例如以下表達式構造了一個序列10、(1,2)、空序列()及(3,4):
(10, (1, 2), (), (3, 4))
序列表達式中的項目可以進行插入及移除操作。
4) 算術表達式(Arithmetic Expressions):包括常見的加、減、乘、除及取模運算等。
5) 比較表達式(Comparison Expressions):Xquery提供了4種比較表達式如數值比較、節點比較等,下例為一個返回結果為“假”的表達式,原因是每個結構化結點均具有自己的標識:
6) 邏輯表達式(Logical Expressions):該表達式的組成形態為“AND”及“OR”中的兩者之一,其運算結果總為TRUE或FALSE(除非出現錯誤例程)。
7) 構造式(Constructors):Xquery提供該方法的用途在于利用查詢結果生成一個XML結構的文件,以便于存儲和調用。其中它提供了在數據模型[XQuery 1.0 and XPath 2.0 Data Model]中列出除命名空間(namespace)節點以外的每一種結構,另外,它還具有一種稱為計算結構(computed constructor)的特殊形式,可以創建出一個文檔節點或其中的某個元素及其屬性。作為構造式中的重要類別——元素構造表達式(Element constructors),通常可實現查詢時除對現有數據進行檢索外,并可利用查詢結果產生新的數據的功能,這種方法允許使用XML的標記法直接將元素包含于查詢之中,也即允許以XML元素本身作為查詢的表達式。在早期的Xquery草案版本中,它曾作為與上述邏輯表達式等相并列的一類表達式出現,新的版本將其歸納于Constructors構造式之中。
8) FLWOR表達式(FLWOR expressions):它由FOR、LET、WHERE、ORDER BY及RETURN等子句以特定順序組合而成。早期版本中含有排序表達式(Sorting)這一類別,是指查詢時有時需要控制輸出數據的排列順序,該子句可設定多個排序條件,并可附加升冪(Ascending)或降冪(Descending)兩個關鍵字設定排序的方向。當時FLWOR表達式只是稱為FLWR表達式,即不含有ORDER BY子句。該表達式第一部分中包含了FOR或LET子句,其值由一到多個變量組成,且變量的組成是其他表達式如路徑表達式等。一個FLWOR表達式可能包括多個FOR或LET子句,并將由WHERE子句進行條件篩選并可通過ORDER BY子句進行排序,最終滿足檢索條件的結點數據才會包含于RETURN子句中。如下例所示,表示可列出設備(Equ)中制造商(Fac)為“沈陽某機械廠”并且于2001年購買的設備名稱(Name):
FOR $e IN document("myxml.xml")//Equ WHERE $e/Fac="沈陽某機械廠"
AND $e/year="2001"
RETURN $e/Name
9) 無序表達式(Unordered Expressions):這一表達式在傳統的數據查詢語言中較少出現,而在定義XML查詢規范時卻有著極其重要的意義,這一表達式未列入早期版本,草案制定的過程中討論增加了這一功能。WEB化下的檢索對實現效率要求極高,故對于一些對排序根本無要求的返回結果若按照常規排序后輸出將會增加服務器運算及響應方面的負擔,以下是一個無序函數使用的示例(查詢返回教師及所對應授課的課程代碼):
unordered(
for $t in document("teachers.xml")//teacher[name = "Wangh"],
$l in document("lessons.xml")//lesson
where $t/lessonid = $l/lessonid
return
{$t/teacherid, $l/lessonid }
)
10) 條件表達式(Conditional Expressions):其基本語法為“if” “(“ Expression1 “)” “then” Expression2 “else” Expression3,含義為首先判斷Expression1 條件式是否滿足,為true則返回Expression2,否則返回Expression3。
11) 限定表達式(Quantified expressions):在某些查詢需求下,需測試是否全部或只有部份元素符合某個條件,Xquery為此專門提供了“some”及“every”表達式用來分別表示“部份”及“全部”的選擇。下例使用“some”表示取得book中段落只要有包含sailing及windsurfing的Name元素:
FOR $b IN //book
WHERE SOME $p IN $b//para SATISFIES
(contains($p, "sailing") AND contains($p, "windsurfing"))
RETURN $b/Name
同樣,下例使用“every”表示取得book中每個段落均含有sailing的Name元素:
FOR $b IN //book
WHERE EVERY $p IN $b//para SATISFIES
contains($p, "sailing")
RETURN $b/Name
12) 用于序列類型的表達式(Expressions on SequenceTypes):它通常作為一種附加的函數參數出現,用于instance of、typeswitch、cast、castable和treat表達式中。
13) 確認型表達式(Validate Expressions):該表達式在早期版本中不列為主要類型,以下為用法示例:
ValidateExpr :: = (<"validate" "{"> | (<"validate" "context"> SchemaGlobalContext ("/" SchemaContextStep)* "{"}) Expr "}"
W3C關于該表達式的說明中指出目前“{”及“}”括號的應用在嵌入式表達式的環境中還存在著一些問題。
3.2 應用示例
制定XQuery標準前W3C提出了針對XML查詢的相關需求,其中一項提及XML查詢語言應可實現在多個文檔中實現關聯性連結查詢。以下以教師授課為例說明其實現過程,要求根據目錄關聯表產生課時安排文檔,將教師與其授課信息以姓名、課程名為序排列輸出。
首先建立三份XML文檔:teachers.xml(教師信息表)、lessons.xml(課程信息表)、catalog.xml(課時安排目錄表)。
teachers.xml中包含若干個
lessons.xml中包含若干個
catalog.xml中含有上述文檔的關聯屬性,由若干個
{
FOR $i IN document ("catalog.xml")//item,
$t IN document ("teachers.xml")//teacher[teacherid=$i/teacherid],
$l IN document ("lessons.xml")//lesson[lessonid=$i/lessonid]
RETURN
{
$t/name,
$l/title,
$i/time
}
SORTBY (name, title)
}
以上示例顯示了一個內部關聯的數據表連結過程,實際上XQuery 中與傳統SQL語言相類似,同樣也提供了外部關聯的操作,如左關聯、右關聯等。
3.3 XSLT與XQuery的比較
XSLT于1999年成為一個W3C建議標準,具有根據相關模板中指定的數據轉換方式對XML結構的文檔進行輸出樣式處理的功能,但是,由于XSLT在表達式和模式方面運用了Xpath,而XPath是XQuery的一個子集,因此它一直與XQuery標準化進程一起被不斷地修訂完善。
XSLT與XQuery之間最顯著的差別在于一個XSLT樣式表(stylesheet )實際上是一個XML文檔,通常與Xquery相比其缺陷是不易閱讀且文檔不夠簡潔。
XSLT和XQuery之間更重要的差異是執行模型,特別是指控制流方面。如果不去考慮Xquery中與眾不同的數據類型,則它可認為是一種相對普通且含有顯式控制流的程序語言。相反,一個XSLT樣式表的執行受一個模板處理器控制,每個節點均與一套模板相匹配對應,并在當前節點的子節點上進行模板的遞歸調用。使用模式匹配方式執行應用通常是較為高效便捷的,但當運用其進行更為復雜的編程時,則會變得很不靈活而且代碼冗長。
4 目前應用狀況
盡管Xquery目前尚處于草案階段,但因其有著良好的應用前景,故而傳統大型數據庫開發公司均在加緊制定各自的標準及規范以期實現對Xquery的支持。2002年3月Oracle發表了Java XQuery的原型標準,其中包含一個XQuery的Java API(稱為JXQI)及一個使用命令行操作的界面。它參照了W3C的Xquery標準并加上Oracle的自定義功能,并致力于文檔關聯及XQuery用例(XQuery use cases)方面的支持。另外它還包含一個實驗性質的JDBC式的Java API供XQuery使用,并可在SQL的查詢結果上使用XQuery。Oracle最終希望能提供XQuery-based兼具SQL風格的查詢語言,以供用戶在Oracle數據庫中對XML文檔內容進行準確查詢。
目前已商業化的軟件產品有X-Hive公司發布的X-Hive/DB 3.0版本,其內置了XQuery引擎,并提供了轉換或格式化XML文檔的功能,可實現XHTML或PDF格式的轉換。為符合用戶需求,X-Hive/DB支持的XML公開標準包含XML 1.0、XQuery、XPath、XSL、XPointer、XLink、Xupdate及DOM.等。此外Ipedo Inc.公司研制的可以運行于Sun Solaris 7 & 8、Red Hat Linux (version 6 & 7)、Windows 2000或Windows NT平臺上的Ipedo XML Database (目前版 本2.0)是一套專門用以存儲XML文檔的數據庫系統,其存儲方式有別于傳統關聯式數據庫,適合作為XML的內容管理平臺。它以XML Schema、DTD來組織與分類文件以實現集中式的XML管理,使用W3C XQuery查詢語言,并可由XML Schema或DTD建立用戶自訂的索引,同時還具有易于整合的特性。
5 結束語
隨著XML技術的發展,各種數據格式之間的差異已逐漸地減少直至可能在未來實現統一化的數據平臺。Xquery的標準制定就是為了解決各類廣泛數據源的數據查詢檢索問題,這種全新的查詢語言將會促進重要的數據技術變革,并將成為統一的數據交換媒介。
參考文獻:
[1] 陳奇. XSLT、Xpath和DOM的應用研究[J]. 計算機工程,2003,29(3):14-15.
[2] World Wide Web Consortium. XML Path Language (XPath) Version 1.0. http://www.w3.org/TR/1999/REC-xpath-19991116. W3C Recommendation 1999-11-16.
[3] World Wide Web Consortium. XQuery 1.0: An XML Query Language. http://www.w3.org/TR/2002/WD-xquery-20021115/. W3C Working Draft 2002-11-15.
[4] World Wide Web Consortium. XQuery and XPath Full-Text Requirements. http:// www. w3.org/TR /xmlquery-full-text-requirements/. W3C Working Draft 2003-02-14.
[5] World Wide Web Consortium. XQuery and XPath Full-Text Use Cases http:// www. w3.org /TR /xmlquery-full-text-use-cases. W3C Working Draft 2003-02-14.