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。
以下我們還是按照之前那個實例來做幾個測試。
測試使用的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')]
2.查詢所有Blog節點值中帶有 cn 字符串并且屬性ID值中有01的Person節點
Xpath表達式:/Root//Person[contains(Blog,'cn') and contains(@ID,'01')]
3.查詢受命名空間約束的Email節點的值中帶有“live”字符串,并且Blog節點值中還帶有cn字符串。
Xpath表達式:/Root/Person//*[local-name()='Email' and contains(text(),'live')]/parent::Person
結果:
4.受命名空間約束的節點與不受命名空間約束的節點及屬性的混合查詢
Xpath表達式:/Root/Person//*[local-name()='Email' and contains(lower-case(text()),'live')][contains(../Blog,'cn')][contains(../Name/@lang,'zh-cn')]/parent::Person
結果:
5.查詢所有節點中值符合Email構造的節點
Xpath表達式://*[matches(text(),'\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*')]
結果:
通過以上測試,通過使用contrains函數和match函數來進行模糊查詢基本上可以滿足基本的使用需求。另外本篇只是列舉了幾個基本例子,在具體使用的時候還需根據實際的情況靈活運用函數和軸構造Xpath表達式以滿足需求。