新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → 能否简单介绍一下XPath的用法? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 32097 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 能否简单介绍一下XPath的用法? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     血痕 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:23
      积分:134
      门派:XML.ORG.CN
      注册:2004/3/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给血痕发送一个短消息 把血痕加入好友 查看血痕的个人资料 搜索血痕在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看血痕的博客楼主
    发贴心情 能否简单介绍一下XPath的用法?

    能否简单介绍一下XPath的用法?

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/27 10:20:00
     
     guoyan1981 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究C++)
      文章:35
      积分:298
      注册:2004/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guoyan1981发送一个短消息 把guoyan1981加入好友 查看guoyan1981的个人资料 搜索guoyan1981在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guoyan1981的博客2
    发贴心情 
    关于XPath

    节点匹配路径Xpath

        在利用XSL进行转换的过程中,匹配的概念非常重要。在模板声明语句xsl:template match = ""和模板应用语句xsl:apply-templates select = ""中,用引号括起来的部分必须能够精确地定位节点。具体的定位方法则在XPath中给出。

       另外,也可以使用Xpath对XML文档进行搜索、定位。

    之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。可以把XPath比作文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点。

    在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基本概念。首先要说的是XPath数据类型。XPath可分为四种数据类型:

    节点集(node-set)
    节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。

    布尔值(boolean)
    由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和false两个值。布尔值可以和数值类型、字符串类型相互转换。

    字符串(string)
    字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。

    数值(number)
    在XPath中数值为浮点数,可以是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无穷大-infinity、正负0等等。number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。

    其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。由于XML文档的逻辑结构,一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还可以包含属性,并可以利用属性来定义命名空间。相应地,在XPath中,将节点划分为七种节点类型:

    根节点(Root Node)
    根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。

    元素节点(Element Nodes)
    元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。
    元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。

    文本节点(Text Nodes)
    文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。

    属性节点(Attribute Nodes)
    每一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。
    对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为#IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。
    此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。

    命名空间节点(Namespace Nodes)
    每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。

    处理指令节点(Processing Instruction Nodes)
    处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。

    注释节点(Comment Nodes)
    注释节点对应于文档中的注释。下面,我们来构造一棵XML文档树:

    <A id="a1">
      <B id="b1">
        <C id="c1">
          <B name="b"/>
          <D id="d1"/>
          <E id="e1"/>
          <E id="e2"/>
        </C>
      </B>
      <B id="b2"/>
      <C id="c2">
        <B/>
        <D id="d2"/>
        <F/>
      </C>
      <E/>
    </A>

    现在,来实现一些利用Xpath使XML中节点匹配的基本方法。

    路径匹配
    路径匹配与文件路径的表示相仿,比较好理解。有以下几个符号:

    符  号
    含  义
    举  例
    匹配结果

    /
    指示节点路径
    /A/C/D
    节点"A"的子节点"C"的子节点"D",即id值为d2的D节点

    /
    根节点

    //
    所有路径以"//"后指定的子路径结尾的元素
    //E
    所有E元素,结果是所有三个E元素

    //C/E
    所有父节点为C的E元素,结果是id值为e1和e2的两个E元素

    *
    路径的通配符
    /A/B/C/*
    A元素→B元素→C元素下的所有子元素,即name值为b的B元素、id值为d1的D元素和id值为e1和e2的两个E元素

    /*/*/D
    上面有两级节点的D元素,匹配结果是id值为d2的D元素

    //*
    所有的元素

    |
    逻辑或
    //B | //C
    所有B元素和C元素


    位置匹配
    对于每一个元素,它的各个子元素是有序的。如:

    举  例
    含  义
    匹配结果

    /A/B/C[1]
    A元素→B元素→C元素的第一个子元素
    name值为b的B元素

    /A/B/C[last()]
    A元素→B元素→C元素的最后一个子元素
    id值为e2的E元素

    /A/B/C[position()>1]
    A元素→B元素→C元素之下的位置号大于1的元素
    id值为d1的D元素和两个具有id值的E元素

    属性及属性值
    在XPath中可以利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有"@"前缀。例如:

    举  例
    含  义
    匹配结果

    //B[@id]
    所有具有属性id的B元素
    id值为b1和b2的两个B元素

    //B[@*]
    所有具有属性的B元素
    两个具有id属性的B元素和一个具有name属性B元素

    //B[not(@*)]
    所有不具有属性的B元素
    A元素→C元素下的B元素

    //B[@id="b1"]
    id值为b1的B元素
    A元素下的B元素

    亲属关系匹配
    XML文档可归结为树型结构,因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,同样可以用到这些概念。例如:

    举  例
    含  义
    匹配结果

    //E/parent::*
    所有E节点的父节点元素
    id值为a1的A元素和id值为c1的C元素

    //F/ancestor::*
    所有F元素的祖先节点元素
    id值为a1的A元素和id值为c2的C元素

    /A/child::*
    A的子元素
    id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

    /A/descendant::*
    A的所有后代元素
    除A元素以外的所有其它元素

    //F/self::*
    所有F的自身元素
    F元素本身

    //F/ancestor-or-self::*
    所有F元素及它的祖先节点元素
    F元素、F元素的父节点C元素和A元素

    /A/C/descendant-or-self::*
    所有A元素→C元素及它们的后代元素
    id值为c2的C元素、该元素的子元素B、D、F元素

    /A/C/following-sibling::*
    A元素→C元素的紧邻的后序所有兄弟节点元素
    没有任何属性的E元素

    /A/C/preceding-sibling::*
    A元素→C元素的紧邻的前面所有兄弟节点元素
    id值为b1和b2的两个B元素

    /A/B/C/following::*
    A元素→B元素→C元素的后序的所有元素
    id为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、无属性的E元素。

    /A/C/preceding::*
    A元素→C元素的前面的所有元素
    id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为b的B元素、id为c1的C元素、id为b1的B元素

    条件匹配
    条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。常用于条件匹配的函数有四大类:节点函数、字符串函数、数值函数、布尔函数。例如前面提到的last()、position()等等。这些功能函数可以帮助我们精确寻找需要的节点。
       

    函数及功能
    作用

    count()功能
    统计计数,返回符合条件的节点的个数

    number()功能
    将属性的值中的文本转换为数值

    substring() 功能

    语法:substring(value, start, length)


    截取字符串

    sum()功能
      
    求和



    这些功能只是XPath语法中的一部分,还有大量的功能函数没有介绍,而且目前XPath的语法仍然在不断发展中。通过这些函数我们可以实现更加复杂的查询和操作。

    以上这些匹配方法中,用得最多的还要数路径匹配。依靠给出相对于当前路径的子路径来定位节点的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/27 13:10:00
     
     肚皮 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:28
      积分:150
      门派:XML.ORG.CN
      注册:2004/4/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给肚皮发送一个短消息 把肚皮加入好友 查看肚皮的个人资料 搜索肚皮在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看肚皮的博客3
    发贴心情 
    很详细
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/27 19:57:00
     
     血痕 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:23
      积分:134
      门派:XML.ORG.CN
      注册:2004/3/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给血痕发送一个短消息 把血痕加入好友 查看血痕的个人资料 搜索血痕在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看血痕的博客4
    发贴心情 
    谢谢。。。真不错~~~~~~~~~~~~~~~
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/4/28 11:35:00
     
     proad 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:0
      积分:54
      门派:XML.ORG.CN
      注册:2004/5/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给proad发送一个短消息 把proad加入好友 查看proad的个人资料 搜索proad在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看proad的博客5
    发贴心情 
    收藏...
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/5/4 14:07:00
     
     hyandlsz 帅哥哟,离线,有人找我吗?
      
      
      头衔:侠
      等级:大二期末(Java考了96分!)
      文章:117
      积分:503
      门派:W3CHINA.ORG
      注册:2004/3/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hyandlsz发送一个短消息 把hyandlsz加入好友 查看hyandlsz的个人资料 搜索hyandlsz在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hyandlsz的博客6
    发贴心情 
    学习!

    ----------------------------------------------
    人最大的烦恼就是记性太好,如果什么都可以忘了,以后的每一天将会是一个新的开始,那你说多开心!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/5/14 11:23:00
     
     sorry_any_wl 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:71
      门派:XML.ORG.CN
      注册:2004/5/24

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给sorry_any_wl发送一个短消息 把sorry_any_wl加入好友 查看sorry_any_wl的个人资料 搜索sorry_any_wl在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看sorry_any_wl的博客7
    发贴心情 
    很通俗易懂,适合初学者!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/5/31 20:12:00
     
     guiguzi629 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:33
      积分:184
      门派:XML.ORG.CN
      注册:2004/9/16

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给guiguzi629发送一个短消息 把guiguzi629加入好友 查看guiguzi629的个人资料 搜索guiguzi629在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看guiguzi629的博客8
    发贴心情 
    好啊 太好了的 现在正在学这块的,
    你实在太帅了的!
    忍不住顶一下的?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/12/1 23:27:00
     
     zpyu 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:11
      积分:97
      门派:XML.ORG.CN
      注册:2004/11/23

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zpyu发送一个短消息 把zpyu加入好友 查看zpyu的个人资料 搜索zpyu在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zpyu的博客9
    发贴心情 
    很好
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/12/5 20:27:00
     
     hello105 帅哥哟,离线,有人找我吗?
      
      
      等级:大二(研究汇编)
      文章:36
      积分:229
      门派:XML.ORG.CN
      注册:2004/6/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hello105发送一个短消息 把hello105加入好友 查看hello105的个人资料 搜索hello105在『 DOM/SAX/XPath 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hello105的博客10
    发贴心情 
    不错不错
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/12/6 11:37:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/3/28 15:46:59

    本主题贴数16,分页: [1] [2]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    171.875ms