这一节中,我们将继续了解以下XPath的基本概念
1、 层次结构
在图 1的XPath”/文件系统/目录/目录/文件”中,按照斜杠的划分,可一层一层地递进解读该路径的含义:
(1) Xpath表达式最前面的斜杠“/”:表示匹配XML文档的根节点(注意根节点是文档节点,不是根元素,文档节点包含XML声明、DOCTYPE声明、顶层的处理指令、顶层注释和根元素节点),根节点是XML节点树中最外面的节点。
(2) “/文件系统”:在“/”基础上更进一层,表示匹配文档节点下的“文件系统”元素。
(3) “/文件系统/目录”:在前面“/文件系统”的基础上更深入一层,匹配“文件系统”下的“目录”元素。
(4) “/文件系统/目录/目录/文件”:以上逻辑类推,即在匹配文档中“文件系统”元素的基础上,再往内两层“目录”元素,匹配其中所有的“文件”元素。在图 1中,则是具有“名称=cmd.exe”和“名称=regedit.exe”的两个“文件”节点。
2、 线性结构
XML文档结构除了从外到里的层次性结构之外,还有一种线性的(Linear)兄弟(Sibling)关系结构。兄弟关系是指两个或者多个节点属于同一个父节点。例如图 1中,“名称=cmd.exe”和“名称=regedit.exe”的两个“文件”元素之间就是兄弟关系。在文档中,前者出现在后者的前面,因此称前者为后者的额“前导兄弟”(Proceding sibling),后者则为前者的“后继兄弟”(Following sibling)。
在XPath中,通过“position()”函数计算节点在线性关系中的位置。例如:XPath“/文件系统/目录[position()=1]”,“[]”中间的内容称为“谓项(Predicate)”,在此使用“position()”函数,规定只匹配“/文件系统”下的第一个“目录”元素。
一、 XPath定位操作返回节点列表
XPath表达式分定位表达式和求值表达式。前者用于定位XML文档中的节点,后者根据定位结果返回值(如字符串、布尔值、数值等)。前者总是返回结果集(Node Set),或称节点列表。如果XPath匹配结果仅有1个节点符合定位条件,那么返回的匹配结果就是由该节点组成的节点集。XPath定位表达式不可能返回值,这在使用XPath时需要额外注意。
二、 根节点不是根元素
初次接触XPath的人需要注意,文档的根节点(Root node)不是根元素(Root element)。根节点就是文档节点,包含了XML文档的所有内容;根元素是XML文档包含其它元素的节点,是根节点的一个子节点。
三、 相对定位和绝对定位
有UNIX或Linux操作系统经验的人都知道,路径开头的“/”,代表文件系统的根路径。与此类似,XPath的定位路径也以“/”代表文档的根节点(即XML文档)。
以“/”开头的定位步骤,称为绝对定位步骤,表示从文档根节点开始定位;不以“/”开头的,则称为相对定位步骤,表示从当前上下文节点开始定位。
下一节,将介绍一下XPath的语法提要。