zoukankan      html  css  js  c++  java
  • [使用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表达式以满足需求。

  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/6941199.html
Copyright © 2011-2022 走看看