之所以要引入XPath的概念,目的就是为了在婚配XML文档结构树时能够精确地找到某一个节点元素。可以把XPath比作文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需求的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点.
不过,由于XPath可使用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分。
在引见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中节点婚配的基本方法。
- 路径婚配
路径婚配与文件路径的表示相仿,比较好理解。有以下几个符号:
符 号 | 含 义 | 举 例 | 婚配结果 |
/ | 指示节点路径 | /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元素 |
//* | 所有的元素 |
免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。