Xpath简明归纳.docx
《Xpath简明归纳.docx》由会员分享,可在线阅读,更多相关《Xpath简明归纳.docx(15页珍藏版)》请在冰豆网上搜索。
Xpath简明归纳
Xpath简明归纳
定义:
XPath是一种用于对XML文档的元件寻址的一语言,设计为XSLT和XPointer使用。
XPath是努力给XSL转换[xslt]和XPointer[XPonter]的共享功能提供一个共同的句法及语意的结果。
目的:
用于对XML[XML]文档元件寻找地址。
同时,有为字符串,数字和布尔的操作提供了基本的手段。
XPath也被设计成以便它有能被用于匹配的一个自然的子集(测试一个节点是否匹配一个模式)。
XPath路径表达式
XPath使用路径表达式来选取XML文档中的节点或者节点集。
这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
可以看下面的表格选取节点 :
表达式
描述
nodename
选取此节点的所有子节点
/
从根节点选取
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.
选取当前节点
..
选取当前节点的父节点
@
选取属性
实例
在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:
路径表达式
结果
bookstore
选取bookstore元素的所有子节点
/bookstore
选取根元素bookstore(注释:
假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径!
)
bookstore/book
选取所有属于bookstore的子元素的book元素。
//book
选取所有book子元素,而不管它们在文档中的位置。
bookstore//book
选择所有属于bookstore元素的后代的book元素,而不管它们位于bookstore之下的什么位置。
//@lang
选取所有名为lang的属性。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
实例
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式
结果
/bookstore/book[1]
选取属于bookstore子元素的第一个book元素。
/bookstore/book[last()]
选取属于bookstore子元素的最后一个book元素。
/bookstore/book[last()-1]
选取属于bookstore子元素的倒数第二个book元素。
/bookstore/book[position()<3]
选取最前面的两个属于bookstore元素的子元素的book元素。
//title[@lang]
选取所有拥有名为lang的属性的title元素。
//title[@lang='eng']
选取所有title元素,且这些元素拥有值为eng的lang属性。
/bookstore/book[price>35.00]
选取所有bookstore元素的book元素,且其中的price元素的值须大于35.00。
/bookstore/book[price>35.00]/title
选取所有bookstore元素中的book元素的title元素,且其中的price元素的值须大于35.00。
选取未知节点
XPath通配符可用来选取未知的XML元素。
通配符
描述
*
匹配任何元素节点
@*
匹配任何属性节点
node()
匹配任何类型的节点
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式
结果
/bookstore/*
选取bookstore元素的所有子节点
//*
选取文档中的所有元素
//title[@*]
选取所有带有属性的title元素。
选取若干路径
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
实例
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式
结果
//book/title|//book/price
选取所有book元素的tilte和price元素。
//title|//price
选取所有文档中的title和price元素。
/bookstore/book/title|//price
选取所有属于bookstore元素的book元素的title元素,以及文档中所有的price元素。
什么是XPath?
XPath使用路径表达式在XML文档中进行导航
XPath包含一个标准函数库
XPath是XSLT中的主要元素
XPath是一个W3C标准
XPath标准函数
XPath含有超过100个内建的函数。
这些函数用于字符串值、数值、日期和时间表、节点和QName处理、序列处理、逻辑值等等。
XPath的节点
XPath将一个XML文档建模成为一棵节点树,有不同类型的节点,包括元素节点,属性节点和正文节点。
在XPath中,有七种类型的节点:
元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。
XPath术语
节点(Node)
在XPath中,有七种类型的节点:
元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
XML文档是被作为节点树来对待的。
树的根被称为文档节点或者根节点。
请看下面这个XML文档:
xmlversion="1.0"encoding="ISO-8859-1"?
>
HarryPotter
JK.Rowling
2005
29.99
上面的XML文档中的节点例子:
(文档节点)
JK.Rowling(元素节点)
lang="en"(属性节点)
基本值(或称原子值,Atomicvalue)
基本值是无父或无子的节点。
基本值的例子:
JK.Rowling
"en"项目(Item)
项目是基本值或者节点。
节点的关系
父(Parent)
每个元素以及属性都有一个父。
在下面的例子中,book元素是title、author、year以及price元素的父:
HarryPotter JK.Rowling
2005
29.99
子(Children)
节点元素可有零个、一个或多个子。
在下面的例子中,title、author、year以及price元素都是book元素的子:
HarryPotter JK.Rowling
2005
29.99
同胞(Sibling)
拥有相同的父的节点
在下面的例子中,title、author、year以及price元素都是同胞:
HarryPotter JK.Rowling
2005
29.99
先辈(Ancestor)
某节点的父、父的父,等等。
在下面的例子中,title元素的先辈是book元素和bookstore元素:
HarryPotter JK.Rowling
2005
29.99
后代(Descendant)
某个节点的子,子的子,等等。
在下面的例子中,bookstore的后代是book、title、author、year以及price元素:
HarryPotter JK.Rowling
2005
29.99
XPath的主要语法构件
是以一个表达式的形式显示的,一个表达式匹配产生式Expr,一个表达式被求值评估产出一个对象,该对象有下列4种基本的类型之一:
1. 节点集合(无序的、无重复的节点集合)
2. 布尔(真或假)
3. 数字(一个浮点数字)
4. 字符串(UCS字符的顺序)
表达式求值发生与上下文有关。
XSLT和XPointer分别地指定了上下文怎样在XSLT和XPointer使用XPath表达式。
上下文组成包括:
1. 一个节点([定义:
上下文节点])
2. 一对非零正整数([定义:
上下文位置]和[定义:
上下文大小])
3. 一个变量绑定的集合
4. 一个函数库
5. 表达式范围内的命名空间声明的集合
上下文位置总是小於或等於上下文的大小。
绑定
由变量名→变量值的映射组成,一个变量的值是一个对象,它的类型可以是任何表达式的值所可能拥有的类型,并且也可以有这里没指定的另外的类型。
他的类型是不确定的。
可以是多样性的。
函数库
由函数名→函数的映射组成,每个函数可以接受0个或0个以上的参数,并且返回单个的结果。
这个文里面约定XPath实现必须支持一个核心函数库(在函数库中的每一个函数都使用一个函数原型,该原型给定返回类型,函数的名称,以及参数的类型。
如果参数类型后跟随一个问号,那么参数是可选的;否则,参数则是必须有的)。
核心函数库中的参数和结果同样有4中基本类型。
当然了,XPath中的函数不是只有固定的,一般情况下我们可以采取XSLT和XPointer通过定义另外的函数来扩展XPath的函数;这些函数的类型中有些对4种基本的类型操作,其它的则对XSLT和XPointer定义的另外的数据类型操作。
空间声明的规则
由前缀→命名空间URI的映射组成。
变量绑定、函数库及命名空间声明对於求表达式或其子表达式的值总是一样的;上下文节点、上下文位置及大小对於求表达式或其子表达式的值则是不同的。
有多种表达式可改变上下文节点,而只有判定词能改变上下文位置和上下文大小。
在描述一种表达式的求值时,必须总是明确地说明是上下文节点、上下文位置、还是上下文的大小对子表达式的求值产生变化,如果没有关于上下文节点、上下文位置、上下文的大小的说明,那么对那种表达式的子表达式的求值就保持不变。
XPath表达式经常出现的位置
在XML属性里
一种重要的表达式类型是地点路径,地址路径选择与上下文节点相关的节点集合。
对是地址路径的表达式求值的结果是节点集合,该节点集合包含地点路径选择的节点。
地址路径能递归地包含表达式,这些表达式用来过滤节点集合。
地址路径与此同时LocationPath相匹配。
分析方法
首先将字符和字符串分解成分割段(token),然后再分析所得到的分割段结果的序列。
注意:
空白符可以自由的在分割段之间被使用。
分段化(tokenization)具体介绍见后面的分段化
地址路径
地址路径有两种:
相对的地址路径和绝对的地址路径。
未经缩写的句法的地址路径的一些例子:
child:
:
para选择上下文节点的para元素孩子
child:
:
*选择上下文节点的所有元素孩子
child:
:
text()选择上下文节点的所有的正文节点
child:
:
node()选择上下文节点的所有的孩子,而不论它们是什么节点类型
attribute:
:
name选择上下文节点的name属性
attribute:
:
*选择上下文节点的所有的属性
descendant:
:
para选择上下文节点的para元素子孙
ancestor:
:
div选择上下文节点的div祖先
ancestor-or-self:
:
div选择上下文节点的div祖先,并且,如果上下文节点为div元素,则该上下文节点也被选择
descendant-or-self:
:
para选择上下文节点中所有的div元素子孙,而且,如果上下文节点是一个div元素,则该上下文节点也被选择
self:
:
para如果上下文节点是一个para元素,选择该上下文节点,否则不选择任何东西
child:
:
chapter/descendant:
:
para选择上下文节点的chapter元素孩子的所有的para元素子孙
child:
:
*/child:
:
para选择上下文节点的所有的para孙子/选择文档根(它总是是文档元素的父)
/descendant:
:
para选择在同一文档中所有的para元素作为上下文节点
/descendant:
:
olist/child:
:
item选择在同一文档中所有的以olist为父的item元素作为上下文节点
child:
:
para[position()=1]选择上下文节点的第一个para孩子
child:
:
para[position()=last()]选择上下文节点的最后一个para孩子
child:
:
para[position()=last()-1]选择上下文节点的倒数第二个para孩子
child:
:
para[position()>1]选择上下文节点中除第一个以外所有的para孩子
following-sibling:
:
chapter[position()=1]选择上下文节点的下一个chapter兄弟
preceding-sibling:
:
chapter[position()=1]选择上下文节点的前一个chapter兄弟
/descendant:
:
figure[position()=42]选择文档中第四十二个figure元素
/child:
:
doc/child:
:
chapter[position()=5]/child:
:
section[position()=2]选择文档元素doc的第五个chapter的第二个section
child:
:
para[attribute:
:
type='warning"]选择的上下文节点中有属性type且值为warning的para孩子
child:
:
para[attribute:
:
type='warning'][position()=5]选择的上下文节点中所有的有属性type且值为warning的para孩子中第五个孩子
child:
:
para[position()=5][attribute:
:
type="warning"]选择的上下文节点中第五个para孩子,如果该孩子有type属性且值为warning的话
child:
:
chapter[child:
:
title='Introduction']选择的上下文节点的chapter孩子,这些孩子有一个或一个以上字串值等於Introduction的title孩子
child:
:
chapter[child:
:
title]选择的上下文节点中有一个或一个以上title孩子的chapter孩子
child:
:
*[self:
:
chapterorself:
:
appendix]选择上下文节点的chapter和appendix孩子
child:
:
*[self:
:
chapterorself:
:
appendix][position()=last()]选择上下文节点的最后一个chapter或appendix孩子
轴
以下是可用到的轴:
l child轴包含上下文节点的孩子
l descendant轴包含上下文节点的子孙;子孙是一个孩子或一个孩子的一个孩子,等等,这样,子孙轴从来不包含属性或命名空间节点
l parent轴包含上下文节点的父,如果有的话
l ancestor轴包含上下文节点的祖先;上下文节点的祖先由上下文节点的父以及父的父等等组成;这样,祖先轴将总是包括根节点,除非上下文节点是根节点
l following-sibling轴包含上下文节点的所有在其后的兄弟,如果上下文节点是属性节点或命名空间节点,following-sibling轴则为空
l preceding-sibling轴包含上下文节点的所有在其前的兄弟,如果上下文节点是属性节点或命名空间节点,preceding-sibling轴则为空
l following轴包含在上下文节点所在的同一文档中,所有依照文档顺序在上下文节点后的节点,但排除所有的子孙,也排除属性节点以及命名空间节点
l preceding轴包含在上下文节点所在的同一文档中,所有依照文档顺序在上下文节点前的节点,但排除所有的子孙,也排除属性节点以及命名空间节点
l attribute轴包含上下文节点的属性,除非上下文节点是元素,该轴将为空
l namespace轴包含上下文节点的命名空间节点,除非上下文节点是元素,该轴将为空
l self轴只是包含上下文节点自己
l descendant-or-self轴包含上下文节点和上下文节点的子孙
l ancestor-or-self轴包含上下文节点和上下文节点的祖先;这样,该轴将总是包括根节点
注意:
ancestor,descendant,following,preceding以及self轴划分了一个文档(忽略属性和命名空间节点):
他们相互不重叠,而且他们组在一起则包含了文档所有的节点。
轴可定义某个相对于当前节点的节点集。
轴名称
结果
ancestor
选取当前节点的所有先辈(父、祖父等)
ancestor-or-self
选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute
选取当前节点的所有属性
child
选取当前节点的所有子元素。
descendant
选取当前节点的所有后代元素(子、孙等)。
descendant-or-self
选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following
选取文档中当前节点的结束标签之后的所有节点。
namespace
选取当前节点的所有命名空间节点
parent
选取当前节点的父节点。
preceding
选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling
选取当前节点之前的所有同级节点。
self
选取当前节点。
步(step)
包括:
轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集
步的语法:
轴名称:
:
节点测试[谓语]
实例
例子
结果
child:
:
book
选取所有属于当前节点的子元素的book节点
attribute:
:
lang
选取当前节点的lang属性
child:
:
*
选取当前节点的所有子元素
attribute:
:
*
选取当前节点的所有属性
child:
:
text()
选取当前节点的所有文本子节点
child:
:
node()
选取当前节点的所有子节点
descendant:
:
book
选取当前节点的所有book后代
ancestor:
:
book
选择当前节点的所有book先辈
ancestor-or-self:
:
book
选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)
child:
:
*/child:
:
price
选取当前节点的所有price子孙。
参考资料: