學一點XPath
(首發於 2018 年 8 月 5 日)
XPath 是一門在 XML 文件中查詢資訊的語言,用於在 XML 文件中通過元素和屬性進行導航。XPath 雖然被設計用來搜尋 XML 文件,不過它也能很好地在 HTML 文件中工作,大部分瀏覽器都支援通過 XPath 來查詢節點。XPath 叫做 path,說明它是以路徑表示式的形式來搜尋元素的,這種路徑表示式與我們計算機系統上的檔案系統路徑表達很類似。接下來,我從節點、語法、軸和運算子這四個部分來學習 XPath 在 XML 文件中的使用。
1. XPath 節點
在 XPath 中,XML 文件是被看作節點樹,有七種型別的節點:元素、屬性、文字、名稱空間、處理指令、註釋和文件(根)節點。
在 XML 文件中,XPath 表示各節點的關係有:父 (Parent)、子 (Children)、同胞 (Sibling)、先輩 (Ancestor)、後代 (Descendant)。
2. XPath 語法
2.1 路徑表示式
XPath 使用路徑表示式來選取 XML 文件中的節點或節點集,節點是沿著路徑 (path) 或者步 (steps) 來選取的。路徑表示式語法規則如下表所示。
表示式 | 描述 |
---|---|
nodename | 選取此節點的所有子節點 |
/ | 從根節點選取 |
// | 選擇任意位置的某個節點 |
. | 選取當前節點 |
.. | 選取當前節點的父節點 |
@ | 選取屬性 |
路徑表示式中絕對路徑、相對路徑和步的概念如下所示。
- 絕對路徑起始於正斜槓 (/)。
- 相對路徑可以起始於任何節點。
- 步包括軸、節點測試、零個或多個謂語,用來更深入地選取節點集,語法為:軸名稱::節點測試[謂語]
2.2 謂語
路徑表示式的實現效果是選取所有符合條件的節點,XPath 還能選取某個特定的節點或者包含一個特定值的節點,這裡需要用到謂語,謂語語法是用中括號指定特定的節點。
表示式 | 描述 |
---|---|
[index] | 選取某節點的第 index 元素 |
[last()] | 選取某節點的最後一個元素 |
[position()<index] | 選擇某節點的前 index 個元素 |
[@name] | 選取包含 name 屬性的元素 |
[name>iddex] | 選取屬性 name 值大於 index 的元素 |
2.3 萬用字元
XPath 在進行多節點選取時,可以使用萬用字元“*”匹配未知元素,使用萬用字元“|”一次選取多條路徑。
2.4 例項
下面以上述 XML 文件為例,通過 XPath 選取元素,演示 XPath 的語法。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <classroom> 3 <student> 4 <id>10001</id> 5 <name lang="zh-CN">Tom</name> 6 <age>22</age> 7 <sex>male</sex> 8 </student> 9 <student> 10 <id>10002</id> 11 <name lang="zh-CN">Jack</name> 12 <age>21</age> 13 <sex>female</sex> 14 </student> 15 </classroom>
實現效果 | 路徑表示式 |
---|---|
選取 classroom 元素所有子節點 | classroom |
選取根元素 classroom | /classroom |
選取元素 classroom 的子元素的所有 student 元素 | classroom/student |
選取元素 student | //student |
選取元素 classroom 的後代 student 元素 | classroom//studetn |
選取名為 zh-CN 所有屬性 | //@lang |
選取元素 classroom 的第 1 個 student 子元素 | classroom/student[1] |
選取元素 name,且有值為 zh-CN 的 lang 屬性 | //name[@lang=’zh-CN’] |
選取元素 classroom 的所有子元素 | classroom/* |
選取文件中所有元素 | //* |
選取所有帶有屬性的 name 元素 | //name[@*] |
選取元素 student 的所有 name 元素和 age 元素 | //student/name | //student/age |
3. XPath 軸
軸定義了所選節點與當前節點之間的樹關係,XPath 中使用到的節點集如下表所示。
軸 | 含義 |
---|---|
child | 選取當前節點的所有子元素 |
parent | 選取當前節點的父節點 |
ancestor | 選取當前節點的所有先輩節點 |
ancestor-or-self | 選取當前節點的所有先輩節點以及當前節點本身 |
descendant | 選取當前節點的所有後代元素 |
descendant-or-self | 選取當前節點的所有後代元素以及當前節點本身 |
preceding | 選取文件中當前節點的開始標記之前的所有節點 |
following | 選取文件中當前節點的結束標記之後的所有節點 |
preceding-sibling | 選取當前節點之前的所有同級節點 |
following-sibling | 選取當前節點之後的所有同級節點 |
self | 選取當前節點 |
attribute | 選取當前節點的所有屬性 |
namespace | 選取當前節點的所有名稱空間節點 |
4. XPath 運算子
XPath 表示式可以返回節點集、字串、邏輯值和數字,表示式中可以使用運算子進行連線,運算子如下表所示。
運算子 | 含義 |
---|---|
| | 計算兩個節點集 |
+ | 加法 |
- | 減法 |
* | 乘法 |
div | 除法 |
= | 等於 |
!= | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
or | 或 |
and | 與 |
mod | 取餘 |