使用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

结果:

image

5.查询所有节点中值符合Email构造的节点

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

结果:

image 

 

通过以上测试,通过使用contrains函数和match函数来进行模糊查询基本上可以满足基本的使用需求。另外本篇只是列举了几个基本例子,在具体使用的时候还需根据实际的情况灵活运用函数和轴构造Xpath表达式以满足需求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值