如果要对XML文件进行模糊查找的话是一个比较麻烦的事情,Xpath表达式中没有像文件系统中的“*”或"?" 或者有像SQL表达式中的"%",这样的模糊查找的通配符。
但是还好,在Xpath的函数中提供了像contains这样的函数。该函数的语法是:fn:contains(string1,string2),表示的是如果 string1 包含 string2,则返回 true,否则返回 false。例如:contains('XML','XM'),结果:true。另外根据之前了解到的Xpath基础知识(参见:BizTalk开发系列(三十四) Xpath)就大概知道如何对XML进行模糊查找了。以下我们还是按照之前那个实例来做几个测试。
测试使用的XML
< 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
结果:
通过以上测试,使用contrains函数来进行模糊查询基本上可以满足日常的使用需求。