1. 简介
xpath, 选择XML文件中节点的方法, 节点是XML文件最小构成单位,分为7种
element (元素节点)
attribute (属性节点)
text (文本节点)
namespace (名称空间节点)
processing-instruction (处理命令节点)
comment (注释节点)
root (根节点)
2. 路径表达式 path expression
xpath通过"路径表达式"(Path Expression)来选择节点
斜杠(/)作为路径内部的分割符。
绝对路径(absolute path) 必须用"/"起首,后面紧跟根节点,比如/step/step/...
相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首。
"."表示当前节点。
".."表示当前节点的父节点
3. 选择节点的基本规则
- nodename(节点名称):表示选择该节点的所有子节点
- "/":表示选择根节点
- "//":表示选择任意位置的某个节点
- "@": 表示选择某个属性
- XML实例
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
- e.g.
bookstore :选取 bookstore 元素的所有子节点。
/bookstore :选取根节点bookstore,这是绝对路径写法。
bookstore/book :选取所有属于 bookstore 的子元素的 book元素,这是相对路径写法。
//book :选择所有 book 子元素,而不管它们在文档中的位置。
bookstore//book :选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang :选取所有名为 lang 的属性
4. 通配符
# "*" 表示匹配任何元素节点。
# "@*" 表示匹配任何属性值。
# node() 表示匹配任何类型的节点
- e.g.
//* :选择文档中的所有元素节点。
/*/* :表示选择所有第二层的元素节点
//title[@*] :表示选择所有带有属性的title元素
5. xpath的谓语条件(Predicate)
所谓"谓语条件",就是对路径表达式的附加条件
所有的条件,都写在方括号"[]"中,表示对节点进行进一步的筛选。
/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'] :表示选择所有lang属性的值等于"eng"的title节点。
/bookstore/book[price] :表示选择bookstore的book子元素,且被选中的book元素必须带有price子元素。
/bookstore/book[price>35.00] :表示选择bookstore的book子元素,且被选中的book元素的price子元素值必须大于35。
/bookstore/book[price>35.00]/title :表示在例14结果集中,选择title子元素。
/bookstore/book/price[.>35.00] :表示选择值大于35的"/bookstore/book"的price子元素
6. 选择多个路径
用"|"选择多个并列的路径。
//book/title | //book/price :表示同时选择book元素的title子元素和price子元素
7. XPath 轴(Axes)
轴可定义相对于当前节点的节点集。
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。
- e.g.
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
8. 运算符
| 计算两个节点集 //book | //cd --> 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 --> 10
- 减法 6 - 4 --> 2
* 乘法 6 * 4 --> 24
div 除法 8 div 4 --> 2
mod 计算除法的余数 5 mod 2 --> 1
= 等于 price=9.80 --> 如果 price 是 9.80,则返回 true, 否则false
!= 不等于
< 小于
<= 小于或等于
> 大于
>= 大于或等于
or 或
and 与
not() 逻辑非
: 命名空间分隔符,将命名空间前缀与元素名或属性名分隔
= 比较是弱类型比较, 1 = ”1“ --> true
9. function
常用函数:
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learn XML</title>
<price>39.95</price>
</book>
<test>
<item>Apple</item>
<item>Banana</item>
<item>Orange</item>
</test>
</bookstore>
name([node-set]) 返回节点的名字(string)
count(node-set) 返回参数node-set中的节点个数
count(//test/child::node()),将会返回和test处于兄弟节点的全部子节点的总数 --> 7
string([object]) 返回对象转换的字符串
string(1) --> "1"
string(//test/item) --> "Apple"
string(//test) --> 43字符的字符串 ...
string-length(string) 取字符串的长度,如果参数被省略则计算上下文节点的string-value值的长度
string-length(//book[position()=1]/title),将会返回user的第一个节点包含的一个字符串的长度 --> 12
substring(string, start [,length]) 取子字符串,注意字符串的位置从1开始
substring((//book[position()=1]/title), 1, 1),将会返回book的第一个节点(title)的第1个字母 --> H
translate(string, string, string) 返回第一个字符串, 第一个字符串中出现第二个参数字符串中的字符的位置,替换为第三个参数字符串中对应位置的字符
translate("bar", "abc", "ABC") --> BAr
concat(string, string [, string]*) 返回参数的串联, 如果参数不是字符串类型,将先使用string()函数转换为字符串,然后计算转换的结果
concat("ab", 3, "ef", "g") --> "ab3efg"
contains(string1, string2) 返回 true, 当第一个参数字符串包含第二个参数字符串, 否则返回 false
contains(//test, "Banana") --> true