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。