XPath(转)[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 miki52777 的 blog

关于xpath的用法

[原作者:guoyan1981]

节点匹配路径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的所有后代元素

本文关键:XPath(转)
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top