1. 程式人生 > >學一點XPath

學一點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 選取此節點的所有子節點
/ 從根節點選取
// 選擇任意位置的某個節點
. 選取當前節點
.. 選取當前節點的父節點
@ 選取屬性

路徑表示式中絕對路徑、相對路徑和步的概念如下所示。

  1. 絕對路徑起始於正斜槓 (/)。
  2. 相對路徑可以起始於任何節點。
  3. 步包括軸、節點測試、零個或多個謂語,用來更深入地選取節點集,語法為:軸名稱::節點測試[謂語]

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 取餘