xpath

来源:互联网 发布:自助牛排知乎 编辑:程序博客网 时间:2024/05/23 16:13

转载: http://www.cnblogs.com/skyblue/archive/2008/06/19/900187.html



定位节点

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::可以从一个定位步骤中省略。

缩写含义示例nonechild::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属性等于classiccd[@type and @country]选择当前节点的子节点中由type和country两个属性的所有cd子节点

XPath表达式


XPath支持数值、布尔表达式。


数值表达式

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

操作符描述示例结果+加6 + 410-减6 - 42*乘

6 * 4

24div除8 div 42mod取模5 mod 21

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

 


布尔表达式

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

OperatorDescription示例结果=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 namename()返回元素的名称namespace-uri()返回节点集中第一个节点的命名空间的URIposition()返回是第几个节点

字符串函数

函数名描述示例和结果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") 

自我测试。


0 0
原创粉丝点击