[使用Xpath對XML進行模糊查詢]


使用Xpath對XML進行模糊查詢

轉載

如果要對XML文件進行模糊查找的話是一個比較麻煩的事情,Xpath表達式中沒有像文件系統中的“*”或"?" 或者有像SQL表達式中的"%",這樣的模糊查找的通配符。但是還好,在Xpath的函數中提供了像contains和match這樣的函數。

contains是一個字符串查找函數
  語法是:fn:contains(string1,string2),表示如果 string1 包含 string2,則返回 true,否則返回 false。
  例如:contains('XML','XM'),結果:true。

match是一個匹配正則表達式的函數
  語法是:fn:matches(string,pattern),表示如果 string 參數匹配指定的模式,則返回 true,否則返回 false。
  例如:matches("12", "[0-9]{1,2}"), 結果:true。

 對於Xpath的一些基礎知識可以參考:BizTalk開發系列(三十四) Xpath 這樣就可以大概知道如何對XML進行模糊查找了。以下我們還是按照之前那個實例來做幾個測試。

測試使用的XML

<Root>

<Person ID="1001" >

<Name lang="zh-cn" >張城斌</Name>

<Email xmlns="www.quicklearn.cn" > cbcye@live.com </Email>

<Blog>http://cbcye.cnblogs.com</Blog>

</Person>

<Person ID="1002" >

<Name lang="en" >Gary Zhang</Name>

<Email xmlns="www.quicklearn.cn" > GaryZhang@cbcye.com</Email>

<Blog>http://www.quicklearn.cn</Blog>

</Person>

</Root>

使用工具:XMLSpy, 注意之前提到了一個開源的Xpath表達式編輯工具:SketchPath 在執行查詢語句時不能正確的顯示查詢結果。因此建議使用XMLSpy做以下測試。

1.查詢所有Blog節點值中帶有 cn 字符串的Person節點

Xpath表達式:/Root//Person[contains(Blog,'cn')]

結果:
image

2.查詢所有Blog節點值中帶有 cn 字符串並且屬性ID值中有01的Person節點

Xpath表達式:/Root//Person[contains(Blog,'cn') and contains(@ID,'01')]

image

3.查詢受命名空間約束的Email節點的值中帶有“live”字符串,並且Blog節點值中還帶有cn字符串。

Xpath表達式:/Root/Person//*[local-name()='Email' and contains(text(),'live')]/parent::Person

結果:

image

4.受命名空間約束的節點與不受命名空間約束的節點及屬性的混合查詢

Xpath表達式:/Root/Person//*[local-name()='Email' and contains(lower-case(text()),'live')][contains(../Blog,'cn')][contains(../Name/@lang,'zh-cn')]/parent::Person]/parent::Person)

結果:

image

5.查詢所有節點中值符合Email構造的節點

Xpath表達式://[matches(text(),'\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)')]

結果:

image

通過以上測試,通過使用contrains函數和match函數來進行模糊查詢基本上可以滿足基本的使用需求。另外本篇只是列舉了幾個基本例子,在具體使用的時候還需根據實際的情況靈活運用函數和軸構造Xpath表達式以滿足需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM