简单说, xpath 就是选择 xml 文件中节点的方法.
所谓节点(node), 就是 xml 文件的最小构成单位, 一共分成 7 种.
- - element(元素节点)
- - attribute(属性节点)
- - text (文本节点)
- - namespace (名称空间节点)
- - processing-instruction (处理命令节点)
- - comment (注释节点)
- - root (根节点)
xpath 可以用来选择这 7 种节点. 不过, 下面的笔记只涉及最常用的第一种 element(元素节点), 因此可以将下文中的节点和元素视为同义词.
一, xpath 表达式的基本格式
xpath 通过 "路径表达式"(Path Expression)来选择节点. 在形式上,"路径表达式" 与传统的文件系统非常类似.
- # 斜杠 (/) 作为路径内部的分割符.
- # 同一个节点有绝对路径和相对路径两种写法.
- # 绝对路径 (absolute path) 必须用 "/" 起首, 后面紧跟根节点, 比如 / step/step/....
- # 相对路径 (relative path) 则是除了绝对路径以外的其他写法, 比如 step/step, 也就是不使用 "/" 起首.
- # "." 表示当前节点.
- # ".." 表示当前节点的父节点
二, 选择节点的基本规则
- 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>
[例 1]
bookstore : 选取 bookstore 元素的所有子节点.
[例 2]
/bookstore : 选取根节点 bookstore, 这是绝对路径写法.
[例 3]
bookstore/book : 选取所有属于 bookstore 的子元素的 book 元素, 这是相对路径写法.
[例 4]
//book : 选择所有 book 子元素, 而不管它们在文档中的位置.
[例 5]
bookstore//book : 选择所有属于 bookstore 元素的后代的 book 元素, 而不管它们位于 bookstore 之下的什么位置.
[例 6]
//@lang : 选取所有名为 lang 的属性.
四, xpath 的谓语条件(Predicate)
所谓 "谓语条件", 就是对路径表达式的附加条件.
所有的条件, 都写在方括号 "[]" 中, 表示对节点进行进一步的筛选.
[例 7]
/bookstore/book[1] : 表示选择 bookstore 的第一个 book 子元素.
[例 8]
/bookstore/book[last()] : 表示选择 bookstore 的最后一个 book 子元素.
[例 9]
/bookstore/book[last()-1] : 表示选择 bookstore 的倒数第二个 book 子元素.
[例 10]
/bookstore/book[position()<3] : 表示选择 bookstore 的前两个 book 子元素.
[例 11]
//title[@lang] : 表示选择所有具有 lang 属性的 title 节点.
[例 12]
//title[@lang='eng'] : 表示选择所有 lang 属性的值等于 "eng" 的 title 节点.
[例 13]
/bookstore/book[price] : 表示选择 bookstore 的 book 子元素, 且被选中的 book 元素必须带有 price 子元素.
[例 14]
/bookstore/book[price>35.00] : 表示选择 bookstore 的 book 子元素, 且被选中的 book 元素的 price 子元素值必须大于 35.
[例 15]
/bookstore/book[price>35.00]/title : 表示在例 14 结果集中, 选择 title 子元素.
[例 16]
/bookstore/book/price[.>35.00] : 表示选择值大于 35 的 "/bookstore/book" 的 price 子元素.
五, 通配符
- # "*" 表示匹配任何元素节点.
- # "@*" 表示匹配任何属性值.
- # node()表示匹配任何类型的节点.
[例 17]
//* : 选择文档中的所有元素节点.
[例 18]
/*/* : 表示选择所有第二层的元素节点.
[例 19]
/bookstore/* : 表示选择 bookstore 的所有元素子节点.
[例 20]
//title[@*] : 表示选择所有带有属性的 title 元素.
六, 选择多个路径
用 "|" 选择多个并列的路径.
[例 21]
//book/title | //book/price : 表示同时选择 book 元素的 title 子元素和 price 子元素.
来源: https://www.jb51.net/article/120035.htm