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"?> <catalog> <cd country="USA"> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <price>10.90</price> </cd> <cd country="UK"> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <price>9.90</price> </cd> <cd country="USA"> <title>Greatest Hits</title> <artist>Dolly Parton</artist> <price>9.90</price> </cd> </catalog> |
下面的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"?> <catalog> <cd country="USA"> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <price>10.90</price> </cd> <cd country="UK"> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <price>9.90</price> </cd> <cd country="USA"> <title>Greatest Hits</title> <artist>Dolly Parton</artist> <price>9.90</price> </cd> </catalog> |
定位节点
XML文档可以看作是一个节点树(非常类似于计算机的树形文件夹)。
XPath使用模式表达式识别XML文档里的节点。一个XPath模式是一个以斜线分隔的子元素名列表,用于描述XML文档的一个路径。模式选择匹配该路径的元素。
下面的XPath表达式选择catalog元素的所有cd元素的所有price元素:
/catalog/cd/price |
注意: 如果路径以一个斜线(/)开始,代表相对于一个元素的绝对路径!
注意: 如果路径以两个斜线开始,表示选择文档中所有符合该条件的元素(即使它们在不同的XML树的级别)!
下面的XPath表达式选择文档中所有的cd元素:
//cd |
选择未知元素
通配符(*)用来选择未知XML元素。
下面的XPath表达式选择catalog元素下所有cd元素的所有子元素:
/catalog/cdprice |
下面的XPath表达式选择有两个祖先的所有price元素:
price |
下面的XPath表达式选择文档中所有元素:
/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函数
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"?> <catalog> <cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <year>1985</year> </cd> <cd> <title>Hide your heart</title> <artist>Bonnie Tyler</artist> <country>UK</country> <company>CBS Records</company> <price>9.90</price> <year>1988</year> </cd> . . . . </catalog> |
在IE6下查看cd目录XML文档cdcatalog.xml 。
选择节点
我们将演示怎样使用selectNodes函数在XML文档中选择节点。这个函数使用一个定位路径作为参数:
xmlobject.selectNodes(XPath expression_r) |
选择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") |