XPath简介
XPath一套语法规则,用语定义XML文档的各个部分。
什么是XPath?
- XPath是定义XML文档各部分的语法
- XPath使用路径定义XML元素
- XPath定义了一个标准函数库
- XPath是XSLT的一个主要元素
- XPath不是用XML书写的
- XPath是一个W3C标准
类似传统的文件路径
XPath使用路径表达式识别XML文档里的节点。这些路径表达式看起来很象计算机的文件系统:
w3schools/xpath/session1.htm |
XPath示例
看下面的一个简单XML文档:
<?xml version="1.0" encoding="ISO-8859-1"?> |
下面的XPath表达式选择根元素catalog:
/catalog |
下面的XPath表达式选择catalog元素的所有cd元素:
/catalog/cd |
下面的XPath表达式选择catalog元素下所有cd元素的所有price元素:
/catalog/cd/price |
注意: 如果路径以一个斜线(/)开始,代表相对于一个元素的绝对路径!
XPath定义了一个标准函数库
XPath定义了一个标准函数库,用于字符串、数字和布尔表达式。
下面的XPath表达式选择price大于10.80的所有cd元素:
/catalog/cd[price>10.80] |
XPath被用于XSLY
XPath是XSLT的一个主要元素。没有XPath知识,我们将无法建立一个XSLT文档。
XPath是一个W3C标准
XPath作为一个寻址XML文档各部分的语言,于1999年11月16日作为W3C推荐标准发布。
XPath被设计用于XSLT、XPointer和其它XML解析软件。
更多的XML和XSL标准,请参考http://www.w3cschools.com。XPath语法
XPath使用路径表达式定位XML文档内的节点。
XML示例文档
我们将使用如下的简单XML文档描述XPath语法:
<?xml version="1.0" encoding="ISO-8859-1"?> |
定位节点
XML文档可以看作是一个节点树(非常类似于计算机的树形文件夹)。
XPath使用模式表达式识别XML文档里的节点。一个XPath模式是一个以斜线分隔的子元素名列表,用于描述XML文档的一个路径。模式选择匹配该路径的元素。
下面的XPath表达式选择catalog元素的所有cd元素的所有price元素:
/catalog/cd/price |
注意: 如果路径以一个斜线(/)开始,代表相对于一个元素的绝对路径!
注意: 如果路径以两个斜线开始,表示选择文档中所有符合该条件的元素(即使它们在不同的XML树的级别)!
下面的XPath表达式选择文档中所有的cd元素:
//cd |
选择未知元素
通配符(*)用来选择未知XML元素。
下面的XPath表达式选择catalog元素下所有cd元素的所有子元素:
/catalog/cd/* |
下面的XPath表达式选择catalog元素的孙子元素下所有的price元素:
/catalog/*/price |
下面的XPath表达式选择有两个祖先的所有price元素:
/*/*/price |
下面的XPath表达式选择文档中所有元素:
//* |
选择分支
通过在XPath表达式中使用方括号可以进一步地指定一个元素。
下面的XPath表达式选择catalog元素的第一个cd子元素:
/catalog/cd[1] |
下面的XPath表达式选择catalog元素的最后一个子元素(注意:没有first()函数):
/catalog/cd[last()] |
下面的XPath表达式选择catalog元素下含有price子元素的所有cd元素:
/catalog/cd[price] |
下面的XPath表达式选择catalog元素下子元素price值等于10.90的所有cd元素:
/catalog/cd[price=10.90] |
下面的XPath表达式选择catalog元素下price元素值等于10.90的所有cd元素的price元素:
/catalog/cd[price=10.90]/price |
选择多个路径
通过在XPath表达式中使用|操作符,可以选择多个路径。
下面的XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素:
/catalog/cd/title | /catalog/cd/artist |
下面的XPath表达式选择文档中所有title元素和artist元素:
//title | //artist |
下面的XPath表达式选择文档中所有title、artist、price元素:
//title | //artist | //price |
下面的XPath表达式选择catalog元素的cd子元素下所有的title元素,以及文档中所有的artist元素:
/catalog/cd/title | //artist |
选择属性
在XPath中,所有属性以前缀@指定。
下面的XPath表达式选择所有名为country的属性:
//@country |
下面的XPath表达式选择所有含有country属性的cd元素:
//cd[@country] |
下面的XPath表达式选择选择所有含有任何属性的cd元素:
//cd[@*] |
下面的XPath表达式选择属性country等于UK的所有cd元素:
//cd[@country='UK'] |
XPath定位路径
一个定位路径表达式返回一个节点集。
定位路径表达式
一个定位路径可以是绝对的或相对的。
绝对定位路径以一个斜线(/)开头,而相对定位路径没有。两种情况下,定位路径由一个或多个定位步骤组成,每个步骤由一个斜线分隔:
一个绝对定位路径: /step/step/... 一个相对定位路径: step/step/... |
定位步骤从左到右,依次按顺序计算。每个步骤根据当前节点集的节点计算。如果定位路径是绝对的,那么当前节点集包含根节点。如果定位路径是相对的,那么当前节点集包含使用表达式的节点。定位步骤包括:
- 一个轴(指定当前定位步骤和当前节点选择的节点间的树关系)
- 一个节点测试(指定定位步骤选择的节点的节点类型和扩展名)
- 零或多个预测(使用表达式进一步抽取定位步骤选定的节点集)
一个定位步骤的语法为:
轴名::节点测试[预测] |
示例:
child::price[price=9.90] |
轴和节点测试
一个轴定义相对于当前节点的节点集。节点测试用于识别轴内的一个节点。我们可以通过名或类型来执行一个节点测试。
轴名 | 描述 |
ancestor |
包含当前节点的所有祖先节点 注意: 除非当前节点是根节点,否则这个轴始终包括根节点 |
ancestor-or-self | 包括当前节点和所有当前节点的祖先节点 |
attribute | 包含当前节点所有的属性 |
child | 包含当前节点所有的子节点 |
descendant |
包含当前节点的所有后代节点 注意:这个轴不包括属性或命名空间节点 |
descendant-or-self | 包含当前节点本身和所有它的后代节点 |
following | 包含文档中当前节点的结束标记后所有节点 |
following-sibling | 包含当前节点后所有的同层节点
注意: 如果当前节点是属性节点或命名空间节点,那么这个轴为空 |
namespace | 包含当前节点的所有命名空间节点 |
parent | 包含当前节点的所有父节点 |
preceding | 包含文档中当前节点的开始标记之前的所有节点 |
preceding-sibling | 包含当前节点之前的所有同层节点
注意: 如果当前节点是一个属性节点或者命名空间节点,那么这个轴为空 |
self | 当前节点本身 |
示例
示例 | 结果 |
child::cd | 选择当前节点的子节点中所有的cd元素(如果当前节点没有cd子节点,那么将返回一个空节点集) |
attribute::src | 选择当前节点的src属性(如果当前节点没有src属性,那么返回一个空节点集) |
child::* | 选择当前节点的所有子元素 |
attribute::* | 选择当前节点的所有属性 |
child::text() | 选择当前节点的文本节点子节点 |
child::node() | 选择当前节点的所有子节点 |
descendant::cd | 选择当前节点的后代中所有cd元素 |
ancestor::cd | 选择当前节点的祖先节点中所有cd元素 |
ancestor-or-self::cd | 选择当前节点的祖先节点中所有cd元素,如果当前节点是一个cd元素,那么也包括当前节点 |
child::*/child::price |
选择当前节点的孙子节点中所有price元素 |
/ | 选择文档根 |
预测
一个预测过滤一个节点集为一个新的节点集。预测放在方括号([])中。
示例
示例 | 结果 |
child::price[price=9.90] | 选择当前节点的子节点中price元素等于9.90的所有价格元素 |
child::cd[position()=1] | 选择当前节点的第一个cd子元素 |
child::cd[position()=last()] | 选择当前节点的最后一个cd子元素 |
child::cd[position()=last()-1] | 选择当前节点的倒第二个cd元素 |
child::cd[position()<6] | 选择当前节点的前五个cd元素 |
/descendant::cd[position()=7] | 选择文档中第七个cd元素 |
child::cd[attribute::type="classic"] | 选择当前节点的所有type属性等于classic的cd子节点 |
定位路径缩写语法
定位路径可以用缩写表示。
最重要的缩写为:child::可以从一个定位步骤中省略。
缩写 | 含义 | 示例 |
none | child:: | cd是child::cd的简写 |
@ | attribute:: | cd[@type="classic"]是child::cd[attribute::type="classic"]的简写 |
. | self::node() | .//cd是self::node()/descendant-or-self::node()/child::cd的简写 |
.. | parent::node() |
../cd是parent::node()/child::cd的简写 |
// | /descendant-or-self::node()/ | //cd是/descendant-or-self::node()/child::cd的简写 |
示例
示例 | 结果 |
cd | 选择当前节点的子节点中所有cd元素 |
* | 选择当前节点的所有子元素 |
text() | 选择当前节点的子节点中所有文本节点 |
@src | 选择当前节点的所有src属性 |
@* | 选择当前节点的所有属性 |
cd[1] | 选择当前节点的第一个cd子节点 |
cd[last()] | 选择当前节点的最后一个cd子节点 |
*/cd | 选择当前节点的所有cd孙子节点 |
/book/chapter[3]/para[1] | 选择book节点的第三个chapter子节点的第一个para子节点 |
//cd | 选择所有文档根的所有cd元素后代,因而在同一个文档选择所有的cd元素作为当前节点 |
. | 选择当前节点 |
.//cd | 选择当前节点的cd元素后代 |
.. | 选择当前节点的父亲节点 |
../@src | 选择当前节点的父节点的src属性 |
cd[@type="classic"] | 选择当前节点的子节点中type属性等于classic的所有cd子节点 |
cd[@type="classic"][5] | 选择当前节点的子节点中type属性等于classic的cd子节点中第五个节点 |
cd[5][@type="classic"] | 选择当前节点的第五个cd子节点,如果该子节点的type属性等于classic |
cd[@type and @country] | 选择当前节点的子节点中由type和country两个属性的所有cd子节点 |
XPath函数
XPath包含转换数据的函数库。
XPath函数库
XPath函数库包含一套用于转换和替换数据的核心函数。
节点集函数
函数名 | 描述 |
count() | 返回被选择的元素的数目 |
id() | 通过元素的唯一ID选择元素 |
last() | 返回最后最后一个节点式第几个节点(等同于总共有几个节点) |
local-name() | 返回节点集中第一节点的local name |
name() | 返回元素的名称 |
namespace-uri() | 返回节点集中第一个节点的命名空间的URI |
position() | 返回是第几个节点 |
字符串函数
函数名 | 描述 | 示例和结果 |
concat() | 将参数字符串连接后返回 | concat('The',' ','XML')
结果: 'The XML' |
contains() | 如果第一个字符串包含第二个字符串,则返回真,否则返回假 |
contains('XML','X') 结果: true |
normalize-space() | 将字符串中前后空格删除后返回 | normalize-space(' The XML')
结果: 'The XML' |
starts-with() | 如果第一个字符串以第二个字符串开头则返回真,否则返回假 | starts-with('XML','X')
结果: true |
string() | 将一个对象转换为字符串后返回 | string(3.14)
结果: '3,14' |
string-length() | 返回一个字符串的长度 | string-length('Beatles')
结果: 7 |
substring() | 从字符串的某个偏移位置开始返回指定长度的字符串 | substring('Beatles',1,4)
结果: 'Beat' |
substring-after() | 返回字符串中从开始到某一字符串第一次出现的位置后的字符串 |
substring-after('12/10','/') 结果: '10' |
substring-before() | 返回字符串中从开始到某一字符串第一次出现的位置前的字符串 | substring-before('12/10','/')
结果: '12' |
translate() | 替换一个字符串中字符 | translate('12:30',':','!')
结果: '12!30' |
数值函数
函数名 | 描述 | 示例 & 结果 |
ceiling() | 返回不小于参数的最小整数 | ceiling(3.14)
结果: 4 |
floor() | 返回不大于参数的最大整数 |
floor(3.14) 结果: 3 |
number() | 转换参数为一个数字 |
number(price) |
round() | 对参数四舍五入 | round(3.14)
结果: 3 |
sum() | 返回所有参数的和 | sum(/cd/price) |
布尔函数
函数名 | 描述 | 示例 & 结果 |
boolean() | 将参数转换为布尔值 | |
false() | 返回假 | number(false())
结果: 0 |
not() | 如果参数是假,则返回真,否则返回假 | not(false()) |
true() | 返回真 |
number(true()) 结果: 1 |
XPath示例
我们使用CD目录这样一个XML文档来阐述一些XPath示例。
CD目录
<?xml version="1.0" encoding="ISO-8859-1"?> |
在IE6下查看cd目录XML文档cdcatalog.xml。
选择节点
我们将演示怎样使用selectNodes函数在XML文档中选择节点。这个函数使用一个定位路径作为参数:
xmlobject.selectNodes(XPath expression) |
选择cd节点
下面的示例选择cd目录中所有的cd节点:
xmlDoc.selectNodes("/catalog/cd") |
选择第一个cd节点
xmlDoc.selectNodes("/catalog/cd[1]") |
选择price节点
xmlDoc.selectNodes("/catalog/cd/price") |
选择price的文本节点
xmlDoc.selectNodes("/catalog/cd/price/text()") |
选择价格大于10.80的cd节点
xmlDoc.selectNodes("/catalog/cd[price>10.80]") |
选择价格大于10.80的price节点
xmlDoc.selectNodes("/catalog/cd[price>10.80]/price") |
http://61.139.52.111:8090/kj/Manfeel/oltl/session1/session1.htm