第9章 XPath查询
XML Path Language(XPath)是一种基于字符串的用于寻址XML文档内容的表达式语言。它为定位XML文档的内容提供一种高效方式。XPath由其他XML技术使用,如Extensible Stylesheet Language Transformations(XSLT)和XML Pointer Language(XPointer)。通过使用XPath表达式,开发人员可以很容易地查找到XML文档中指定的节点元素。在本章我们将讨论XPath相关核心知识。
本章知识要点:
理解XPath数据模型
理解XPath定位步骤
了解XPath常用函数
熟练使用XPath定位路径
9.1 基本知识
XQuery和XPath可以结合起来让XML用户定位和查询XML文档,同时对这些文档的树状表示进行遍历以便进行系统级的端到端处理。XQuery负责查询,而XPath负责遍历。XPath表达式提供了一种方法来定位任何XML文档的树状表示中的某些特定节点。
9.1.1 XPath数据模型
在XPath中,XML文档从概念上讲是一个树结构。文档的每个部分都表示一个节点。这个数据结构类似于计算机硬盘上的文件和文件夹的结构;节点类似于单个文件或文件夹。文件夹包含文件和其他文件夹,同样,一些节点可以包含其他节点。在XPath中,节点的层次结构以一种可以搜索的结构建立起来的,以表示XML文档中的元素。
9.1.2 XPath定位操作返回节点列表
XPath用来查询指定的节点数据,在本实例使用XPath来简单查询指定节点列表。
9.2 使用MSXML文档对象模型执行XPath查询
MSXML是提供核心XML服务的Microsoft软件组件。MSXML解析器基于XML文档对象模型。微软正式发布了其XML的核心服务组件---MSXML 4.0。和MSXML 3.0相比,MSXML 4.0提供了大量的新功能和功能改进。其中包括:对XML模式语言的支持,更快的分析器和XSLT引擎,对XML进行更好的处理,更好的一致性支持。在使用MSXML执行XPath查询前,如果本地计算机中没有安装该组件,那么需要到官方下载匹配版本的MSXML组件。
9.3 XPath定位路径
前面介绍了XPath中XML文档的结构,下面介绍如何使用该结构来定位文档中的指定部分。定位路径是一个表达式,指定如何在XPath树结构中从一个节点到另一个节点地浏览。定位路径由定位步骤组成,每个步骤由一个“轴心”、一个“节点测试”和一个可选的“谓词”组成。在本节前三小节中分别介绍步骤的三个组成部分,最后一小节介绍如何使用定位路径来查找指定元素。
9.3.1 轴
上下文节点是定位路径表达式所基于的节点。轴指定当前定位步骤和上下文节点选择的节点间的树关系。在XML文档中搜索是从XPath树结构的一个上下文节点开始的,所以搜索XPath树结构与该上下文节点有关。
9.3.2 节点测试
节点测试NCName:*中的NCName应该是命名空间的前缀,否则认为发生了错误。该测试对于任何该命名空间下的基本节点类型的节点为true,例如,child::xhtml:*将会选择上下文节点的子节点中所有xhtml命名空间下的节点(假定xhtml命名空间存在)。
节点测试 |
说明 |
* |
选择同一主要节点类型的所有子节点 |
node() |
匹配任何节点 |
text() |
匹配文本节点 |
comment() |
匹配注释节点 |
processing-instruction() |
匹配处理指令节点 |
节点名称 |
匹配带有指定节点名的所有节点 |
9.3.3 表达式
XPath表达式使用路径表示法(与URL中使用的路径表示法类似)寻址XML文档的各个部分。表达式计算计算结果为节点集、布尔值、数字或字符串类型的对象。例如,表达式book/author将返回<book>元素中包含的<author>元素的节点集(前提是此类元素已在源XML文档中声明)。此外,XPath表达式还可以包含谓词(筛选表达式)或函数调用。
URL |
XPath表达式 |
由文件系统中的文件夹和文件组成的层次结构。 |
由XML文档中的元素和其他节点组成的层次结构。 |
每个级别具有唯一名称的文件。URL总是标识单个文件。 |
每个级别的元素名可能不是唯一的。XPath表达式标识所有匹配的元素集。 |
相对特定文件夹(称为“当前文件夹”)进行计算。 |
相对特定节点(称为表达式的“上下文节点”)进行计算。 |
9.4 函数
可以使用XPath函数改进XPath查询,并提高XPath的编程能力和灵活性。
分类名称 |
概述 |
Node-Set |
接受node-set参数,返回参数集,或返回/提供有关节点集中特定节点的信息。 |
String |
对字符串参数执行计算、格式化和处理。 |
Boolean |
计算参数表达式,以获取布尔值结果。 |
Number |
计算参数表达式,以获取数字结果。 |
9.4.1 字符串函数
字符串函数用来对查询结果进行格式化处理。
字符串函数 |
说明 |
示例 |
concat() |
连接两个或多个字符串 |
concat('hello',' ','China')结果返回字符串 'hello ' |
contains() |
若第一个字符串包含第二个字符串,则返回真;否则返回假 |
contains('1123','3'),3包含于第一个字符串中,所以返回值为真 |
normalize-space() |
删除字符串前后的空格 |
normalize-space(' hello')返回字符串'hello' |
starts-with() |
如果第一个字符串以第二个字符串开头,则返回真;否则返回假 |
starts-with('hello','o'),字符串hello不是以o开头,所以返回值为假 |
string() |
将一个对象转换成字符串 |
string(658),将整型数值658转变为字符串'658' |
string-length() |
返回字符串的长度 |
string-length('123456')返回字符串长度为6 |
substring() |
从主字符串中返回从指定位置开始指定长度的字符串 |
substring('string',2,3),返回字符串'tri' |
substring-after() |
返回主字符串中从指定字符串以后的字符串 |
substring-after('string', 'i'),返回字符串'ng' |
substring-before() |
返回主字符串中从指定字符串以前的字符串 |
substring-before('string', 'i'),返回字符串'str' |
translate() |
替换字符串中的字符 |
translate('date', 'e', 'a')替换结果返回字符串'data' |
9.4.2 数值函数
数值函数用来对数值型数据进行数学计算。
数值函数 |
说明 |
示例 |
ceiling() |
返回不小于参数的最小整数 |
ceiling(5.39)返回值为6 |
floor() |
返回不大于参数的最大整数 |
floor(5.39)返回值为5 |
number() |
转换参数为数值型 |
number('5.14')返回值为5.14 |
round() |
返回参数的四舍五入后的值 |
round(3.2)返回值为3 round(4.8)返回值为5 |
sum() |
返回指定节点集中节点总数目 |
sum(/food/price)返回食品的总价 |
9.4.3 布尔函数
布尔值用来判断有参数指定的值是否为预期值或者把参数值转换为布尔值。
布尔函数 |
说明 |
boolean() |
将参数转换为布尔值 |
false() |
返回假 |
not() |
如果参数为真,则返回假;否则返回真 |
true() |
返回真 |
9.4.4 节点集函数
节点集函数用来针对节点集进行元素的函数。
节点集函数 |
说明 |
last() |
返回元素节点集中的最后一个元素节点 |
position() |
返回测试节点集中上下文节点的位置数 |
count(节点集) |
返回节点集中的节点数 |
id(字符串) |
返回元素节点,这些元素节点的ID属性与变量字符串指定的值匹配 |
local-name(字符串) |
返回节点集中第一个节点的扩展前缀的本地部分。参数值不包含名称空间前缀的节点名称 |
namespace-URI(节点集) |
返回节点集中第一个节点的扩展前缀的命名空间URI |
name(节点集) |
返回节点集中第一个节点的完整名称 |
9.5 图书查询
本章主要介绍了XPath定位路径的基本语法以及XPath中常用函数。而深入理解XPath定位步骤则是理解XPath定位路径的核心内容。在本节将通过一个实例综合使用本章所介绍的知识点。