1. XPath概述
XPath是一种在XML文件中,进行节点定位和选取的语言。他的核心是通过“路径表达式”,对某一符合路径表达式要求的节点集合进行选取。
2. XPath中的树模型
XPath把XML文件中的节点组织为树状。XPath定义了7中节点类型:根节点,元素节点,文本节点,属性节点,名字空间节点,命令处理节点,注释节点。他们之间的关系可以表述如下:
引用关系 |
父子关系 |
根节点 |
元素节点 |
文本节点 |
属性节点 |
命令处理节点 |
注释节点 |
名字空间节点 |
注:父子关系是指前节点是后节点的父亲,后节点是前节点的儿子。引用关系是指前节点是后节点的父亲,但后节点不是前节点的儿子。
3. 路径表达式(LocationPath)
LocationPath->AbsoluteLocationPath | RelativeLocationPath
AbsoluteLocationPath->/RelativeLocationPath? | AbbreviatedAbsoluteLocationPath
RelativeLocationPath->Step | RelativeLocationPath/Step | AbbreviatedRelativeLocationPath
AbbreviatedAbsoluteLocationPath->//RelativeLocationPath
AbbreviatedRelativeLocationPath-> RelativeLocationPath//Step
AbbreviatedStep->. | ..
AbbreviateAxisSpecifier->@?
Step->AxisSpecifier NodeTest Predicate* | AbbreviatedStep
AxisSpecifier->AxisName:: | AbbreviatedAxisSpecifier
AxisName->ancestor | ancestor-or-self | attribute | child |
descendant | descendant-or-self | following | following-sibling |
namespace | parent | preceding | preceding-sibling | self
NodeTest->
Predicate->[PredicateExpr]
PredicateExpr->Expr
Expr->
AndExpr->EqualityExpr | AndExpr and EqualityExpr
EqualityExpr->RelationExpr | EqualityExpr=RelationExpr | EqualityExpr!=RelationExpr
RelationExpr->AdditiveExpr | RelationExpr<AdditiveExpr | RelationExpr<=AdditiveExpr |
RelationExpr>AdditiveExpr | RelationExpr>=AdditiveExpr
AdditiveExpr-> MultiplicativeExpr | AdditiveExpr+MultiplicativeExpr |
AdditiveExpr–MultiplicativeExpr
MultiplicativeExpr->UnaryExpr | MultiplicativeExpr*UnaryExpr |
MultiplicativeExpr div UnaryExpr |
MultiplicativeExpr mod UnaryExpr
UnaryExpr->UnionExpr | -UnaryExpr
UnionExpr->PathExpr |
PathExpr->LocationPath | FilterExpr | FilterExpr/RelativeLocationPath |
FilterExpr//RelativeLocationPath
FilterExpr->PrimaryExpr | FilterExpr Predicate
PrimaryExpr->VariableReference | (Expr) | Literal | Number | FunctionCall
FunctionCall->FunctionName((Argument(,Argument)*)?)
Argument->Expr
4. 缩写(Abbreviated)
为了简化XPath表达式的表示形式和提高表达式的可读性,XPath提供了一些省略的表达式形式。其中包括:
简写 |
作用 |
(空) |
self |
// |
descendant-or-self |
@ |
获取某一属性 |
. |
self |
.. |
parent |
.// |
descendant |
* |
child |
5. 轴(AxesName)
AxisName->ancestor | ancestor-or-self | attribute | child |
descendant | descendant-or-self | following | following-sibling |
namespace | parent | preceding | preceding-sibling | self
轴用于代表一类的节点集合。XPath一共定义了13个轴,分别是:
a) ancestor:
i. 作用:获取该节点的父节点,及所有祖先节点。(不包括属性节点,名字空间节点)。
b) ancestor-or-self
i. 作用:获取当前节点,及其所有祖先节点。
c) attribute:
i. 作用:获取当前节点的所有属性节点。
d) child:
i. 作用:获取该节点的所有子节点。
e) descendant:
i. 作用:获取该节点的子节点,及所有孙子节点。(不包括属性节点,名字空间节点)。
f) descendant-or-self
i. 作用:获取该节点,及其所有孙子节点。
g) following
i. 作用:获取该节点的所有后续兄弟节点,及其兄弟节点的子孙节点。(不包括属性节点,名字空间节点)。
h) following-sibling
i. 作用:获取该节点的所有后续兄弟节点。(不包括子孙节点,属性节点,名字空间节点)。
i) namespace
i. 作用:获取该节点的名字空间节点。
j) parent
i. 作用:获取该节点的父节点。
k) preceding
i. 作用:获取该节点的所有前导兄弟节点,及其兄弟节点的子孙节点。(不包括属性节点,名字空间节点)。
l) preceding-sibling
i. 作用:获取该节点的所有前导兄弟节点。(不包括子孙节点,属性节点,名字空间节点)。
m) self:
i. 作用:获取当前节点。
6. NodeTest
NodeTest->
NodeTest用于在轴所选择的范围内,对节点集进行筛选和过滤。
NameTest->* | NCName* | Qname
NodyType->comment | text | processing-instruction | node
NCName:表示非限定名,即一般的变量名。
Qname:是带前缀格式的名称。即prefix:name
7. 谓词(Predicate)
Predicate用于对候选的节点集里面的节点进行过滤,当谓词表达式的返回值为true时,该节点将被包括到新的节点集中。
8. 函数(FunctionCall)
FunctionCall->FunctionName((Argument(,Argument)*)?)
Argument->Expr
XPath提供了一个称为核心函数的函数包供程序员使用,其中主要分为节点集函数,字符串函数,布尔函数,数学函数:
a) 节点集函数:
i. number last():
1. 作用:返回最后一个子节点的索引值。
2. 例子:param[last()]:返回最后一个param子节点。
ii. number position()
1. 作用:返回节点在父节点的子节点列表中的索引值。
iii. number count(node-set)
1. 作用:返回节点集中的节点个数。