在使用關聯式資料庫時,我們通過sql語句來檢索資料來源,這沒有任何問題,但是關係資料也存在著一定的局限性,只能儲存結構化的資料
當資料集是非結構化的時候該怎樣儲存呢,最簡單的辦法就是封裝成xml。
應用開發中我們經常使用xml作為資料來源來儲存一些非結構化的資料,然而是否存在一種語言可以像sql語句檢索關聯式資料庫一樣來檢索xml呢?答案就是xquery。
xquery本身的文法結構並不複雜,xml節點位置是通過xpath進行描述的,在輔以相應的邏輯運算式,滿足使用者的檢索喜好設定。
有關xquery和xpath的教程可參考如下網址
http://www.w3school.com.cn/xpath/index.asp
http://www.w3school.com.cn/xquery/index.asp
幾個比較基礎的文法資訊如下:
xpath中通過'/'來表示節點層級結構,'//'表示所有節點
節點過濾條件寫在'[ ]'裡
節點屬性加@符
如//person[@name='zhangsan']/password 表示擷取姓名為zhangsan的使用者密碼
對應的xml結構是這樣的<root><person name="zhangsan"><password>mima</password></person> person...</root>
xquery中
where語句用來指定過濾條件
return語句用來設定返回的結果集
for語句用來執行遍曆
where和return子句裡都可以加if/else條件判斷邏輯
幾個比較常用的功能函數:
data(element):返回節點的text
contains(element,value):查詢模糊比對
doc(filePath):載入xml資料檔案
如:
for $x in doc("persons.xml")//person
where $x/@age > 20 and contains($x/@name,'張')
return if($x/@sex='男') then data($x/password) else ()
表示:
查詢姓張並且年齡大於20的人,如果是男性返回密碼,如果是女性返回空
javaAPI使用
這裡主要使用saxon來執行xquery,具體應用可參考如下網址:
http://www.cs.duke.edu/courses/fall08/cps116/docs/saxon/samples/java/XQJExamples.java
saxon的jar包可到這裡下載:
http://download.csdn.net/detail/javaman_chen/5107221
使用大致如下:
//首先擷取xml的資料來源串連XQDataSource ds = new SaxonXQDataSource();XQConnection conn = ds.getConnection();//通過XQExpression執行xqueryXQExpression expression = conn.createExpression();XQResultSequence res=expression.executeQuery("doc(persons.xml)//person....");//處理結果集while(res.next()){ res.getObject();}
另外:
xquery的doc()函數需要傳遞xml的文檔路徑,然而在開發時,我們的xml資料來源可能還沒有組建檔案,對此,XQExpression提供了API,可以直接綁定xml資料而不用載入xml文檔
expression.bindNode(XQConstants.CONTEXT_ITEM, org.w3c.dom.Document doc, null);
doc對象可通過DocumentBuilder類產生
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc=db.parse(new ByteArrayInputStream("<person>zhangsan</person>".getBytes()));