XML中的XPath介绍

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/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支持数值、布尔表达式。


数值表达式

数值表达式用于执行对数字的算术运算。

操作符 描述 示例 结果
+ 6 + 4 10
- 6 - 4 2
*

6 * 4

24
div 8 div 4 2
mod 取模 5 mod 2 1

注意: XPath在执行算术表达式前总是将每个操作数转换为一个数字。

 


布尔表达式

布尔表达式用于比较两个值。

Operator Description 示例 结果
= Like (equal) price=9.80 真(如果price=9.80)
!= Not like (not equal) price!=9.80
< 小于 price<9.80 假(如果price=9.80)
<= 小于等于 price<=9.80
> 大于 price>9.80
>= 大于等于 price>=9.80
or price=9.80 or price=9.70 真(如果price等于9.80)
and price<=9.80 and price=9.70


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)


选择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

原文地址:https://www.cnblogs.com/skyblue/p/900187.html