XML
XPATH
概括说明
1. /用于匹配绝对路径,//直接匹配所有的节点,两个匹配符可以一起使用;
2. *用于匹配所有内容,可以在节点、属性等所有位置使用;
3. or和 and用于表达逻辑关系,可以在节点、属性等所有位置使用;
4. [ ]用于设定具体节点的定义内容,[@prop]用于定位名称为prop的属性;
5. 运算符:
a) div除法;
b) mod取余;
c) +加法;
d) –减法;
6. 函数:
a) last()标记最后一个元素;
b) not()排除函数内的定义元素;
c) normalize-space()去处元素值的前后空格;
d) count()元素计数;
e) name()元素名称;
f) starts-with()元素值的起始数值;
g) contains()元素值包含内容;
h) string-length()元素值的长度;
i) position()节点在同级别节点中的位置,计数从1开始;
j) floor()去尾函数;
k) ceiling()向上取整函数;
7. 节点关联定位:
a) child::节点的子节点;
b) descendant::节点的所有子节点,不包括本节点;
c) parent::节点的父节点;
d) ancestor::节点的所有父节点,包括父节点、父节点的父节点等等,一直到根节点包括根节点;
e) following-sibling::节点的所有同级别节点,不包括本节点;
f) preceding-sibling::本节点以前的同级别节点;
g) following::本节点后面的同级别节点;
h) preceding::本节点前面的同级别节点和其所有子节点;
i) descendant-or-self::本节点与本节点所有的子节点;
j) ancestor-or-self::本节点与所有的父节点,一直到根节点,并且包括根节点;
k) ancestor:: descendant::following:: preceding:: self::都可以进行相关含义的定位;
一些注意问题:
//@prop和//*[@prop]的区别
//@prop查询到的结果是属性的集合,并不是包含这个属性的节点集合。若想获得包含这个属性的节点集合,需要使用//*[@prop]。
XPATH查询的节点结果
查询结果的节点,若包含子节点则一样被关联出来。这就是说查询的节点结果,其实是一个指向源DOC对应节点的一个指针。
一些使用范例
1. /用于表达绝对路径
/AAA |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB> <BBB/> </BBB> </DDD> </CCC> </AAA> |
搜索根节点 |
/AAA/DDD/BBB |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB> <BBB/> </BBB> </DDD> </CCC> </AAA> |
搜索内容一级一级的进行嵌套,上面第二行的BBB就不会被选择出来 |
2. //在任何一个层级搜索满足条件的内容
//BBB |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB> <BBB/> </BBB> </DDD> </CCC> </AAA> |
这样,只要名称匹配的内容都会被搜索出来 |
//DDD/BBB |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB> <BBB/> </BBB> </DDD> </CCC> </AAA> |
/ 和 //两种定位符可以嵌套使用 |
3. *作为通配符存在
/*/*/*/BBB |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB> <BBB/> </BBB> </DDD> </CCC> </AAA> |
* 可以替代当前定位位置的任何内容,并且可以多次使用 |
//* |
<AAA> <BBB/> <CCC/> <BBB/> <DDD> <BBB/> </DDD> <CCC> <DDD> <BBB> <BBB/> </BBB> </DDD> </CCC> </AAA> |
这样相当于选择了所有的节点 |
4. []进行节点的细节定义
/AAA/BBB[1] |
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> |
括号中直接填写数字,相当于定位第几个节点,类似于数组的下标,不过起始编号从1开始 |
/AAA/BBB[last()] |
<AAA> <BBB/> <BBB/> <BBB/> <BBB/> </AAA> |
last() 函数,直接指向到最后一个节点 |
//BBB[@id] |
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA> |
选择拥有id属性的节点,上面的例子也可以写成 //BBB[@id=’b1’]一样选择这个节点 |
//BBB[@name=’bbb’] |
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA> |
空格在内容匹配中是做匹配的,所以第一个BBB没有被选择,因为name的值前后有空格 |
//BBB[normalize-space(@name)=’bbb’] |
<AAA> <BBB id = "b1"/> <BBB name = " bbb "/> <BBB name = "bbb"/> </AAA> |
normalize-space 函数会去处属性值前后的空格,所以选中了2个BBB |
//*[count(BBB)=2] |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
count 函数可以对元素进行计数统计,所以CCC并没有被选中 |
//*[count(*)=2] |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
* 通配符,在这里依然可以使用 |
//*[count(*)=3] |
<AAA> <CCC> <BBB/> <BBB/> <BBB/> </CCC> <DDD> <BBB/> <BBB/> </DDD> <EEE> <CCC/> <DDD/> </EEE> </AAA> |
根节点也在选择的范围之内 |