XPath节点
<?xml version="1.0" encoding="ISO-8859-1"?>
<classroom>
<student>
<id>100</id>
<name lang="en">jack</name>
<age>20</age>
</student>
</classroom>
其中,<classroom>是文档节点, <id>100</id>是元素节点,lang="en"是属性节点,jack是文本。
节点间关系包括父(Parent),子(Children),同胞(Sibling),先辈(Ancestor),后代(Descendant)。如student元素是id,name,age的父。
XPath语法
使用路径表达式来选取节点或节点集。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 选择任意位置的某个节点 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
如:
<?xml version="1.0" encoding="ISO-8859-1"?>
<classroom>
<student>
<id>100</id>
<name lang="en">jack</name>
<age>20</age>
</student>
<student>
<id>101</id>
<name lang="en">tom</name>
<age>21</age>
</student>
</classroom>
- 选取classroom的所有子节点
classroom
- 选取根元素classroom
/classroom
- 选取属于classroom的子元素的所有student元素
classroom/student
- 选取所有student子元素,而不管它们在文档中的位置
//student
- 选取属于classroom的子元素的所有student元素 ,而不管它们在classroom下的什么位置
classroom//student
- 选取名为lang的所有属性
//@lang
以上是用来选取所有符合条件的节点。
而若要选取某个特定的节点,则需要用到谓语(嵌在方括号里)。 - 选取属于classroom子元素的第一个student元素
/classroom/student[1]
- 选取属于classroom子元素的最后一个student元素
/calssroom/student[last()]
- 选取属于classroom子元素的倒数第二个student元素
/calssroom/student[last()-1]
- 选取最前面的两个属于classroom元素的子元素的student元素
/calssroom/student[position()<3]
- 选取所有拥有名为lang的属性的name元素
//name[@lang]
- 选取所有name元素,且这些元素拥有值为eng的lang属性
//name[@lang='eng']
- 选取classroom元素的所有student元素,且其中的age元素的值大于20
/classroom/student[age>20]
- 选取classroom元素的所有子元素
/classroom/*
- 选取所有带有属性的name元素
//name[@*]
- 选取student元素的所有name和age元素
//student/name | //student/age
XPath轴
轴定义了所选节点与当前节点间的树关系。若首先提取到一个节点信息,然后想在这个节点的基础上提取它的子节点或者父节点,就可以用到这个概念。
- 绝对路径:起始于正斜杠(/),如
/step/step/...
- 相对路径:
step/step/...
首先提出一个“步”的概念:轴名称::节点测试[谓语]。
- 选取当前classroom节点中子元素的student节点
/classroom/child::student
*选取/classroom/student/name节点下的所有属性/classroom/student/name/attribute::*
XPath运算符
如:
- 除 :
/classroom/student[age = 40 div 2]
,类似,加减乘分别为+ - *
。 - 与 :
/classroom/student[age > 20 and age < 25]
,类似,“或”为and
。