加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Xpath对XML进行模糊查询

发布时间:2020-12-16 00:37:26 所属栏目:百科 来源:网络整理
导读:如果要对XML文件进行模糊查找的话是一个比较麻烦的事情,Xpath表达式中没有像文件系统中的“*”或"?" 或者有像SQL表达式中的"%",这样的模糊查找的通配符。但是还好,在Xpath的函数中提供了像contains和match这样的函数。 contains 是一个字符串查找函数 语
如果要对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

  1. <Root>
  2. <Person ID="1001" >
  3. <Name lang="zh-cn" >张城斌</Name>
  4. <Email xmlns="www.quicklearn.cn" > [email]cbcye@live.com[/email] </Email>
  5. <Blog>http://cbcye.cnblogs.com</Blog>
  6. </Person>
  7. <Person ID="1002" >
  8. <Name lang="en" >Gary Zhang</Name>
  9. <Email xmlns="www.quicklearn.cn" > [email]GaryZhang@cbcye.com[/email]</Email>
  10. <Blog>http://www.quicklearn.cn</Blog>
  11. </Root>
复制代码
使用 工具 : XMLSpy ,注意之前提到了一个 开源 的Xpath表达式编辑工具: SketchPath在执行查询语句时不能正确的显示查询结果。因此建议使用XMLSpy做以下测试。

1.查询所有Blog节点值中带有 cn 字符串的Person节点
Xpath表达式:/Root//Person[contains(Blog,'cn')]


2.查询所有Blog节点值中带有 cn 字符串并且属性ID值中有01的Person节点

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表达式以满足需求。


//div[contains(text(),'${firstname}')]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读