Selenium系列5-XPath路徑表示式

RockChe發表於2021-09-18

Xpath介紹

  • XPath 使用路徑表示式在 XML 文件中進行導航

    • XPath 使用路徑表示式來選取 XML 文件中的節點或者節點集。這些路徑表示式和我們在常規的電腦檔案系統中看到的表示式非常相似。
  • XPath 包含一個標準函式庫

    • XPath 含有超過 100 個內建的函式。這些函式用於字串值、數值、日期和時間比較、節點和 QName 處理、序列處理、邏輯值等等。
  • XPath 是 XSLT 中的主要元素

    • XPath 是 XSLT 標準中的主要元素。如果沒有 XPath 方面的知識,就無法建立 XSLT 文件。

      可以在《XSLT 教程》中閱讀更多的內容。

      XQuery 和 XPointer 均構建於 XPath 表示式之上。XQuery 1.0 和 XPath 2.0 共享相同的資料模型,並支援相同的函式和運算子。

      可以在《XQuery 教程》中閱讀更多有關 XQuery 的知識。

  • XPath 是一個 W3C 標準

    • XPath 於 1999 年 11 月 16 日 成為 W3C 標準。

      XPath 被設計為供 XSLT、XPointer 以及其他 XML 解析軟體使用。

      可以在《W3C官方教程》中閱讀更多有關 XPath 標準的資訊

Xpath與HTML對比

  • XML是指擴充套件標記語言,是標準通用標記語言的一個子集;與HTML類似,但它並非HTML的替代品,它們為不同的目的而設計。

  • HTML被設計用來顯示資料,其焦點是資料的外觀。XML被設計為傳輸和儲存資料,其焦點是資料的內容。

Xpath術語

節點

在 XPath 中,有七種型別的節點:元素、屬性、文字、名稱空間、處理指令、註釋以及文件(根)節點。XML 文件是被作為節點樹來對待的。樹的根被稱為文件節點或者根節點。

請看下面這個 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>
  <book>
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

上面的XML文件中的節點例子:

<bookstore> (文件節點)
<author>J K. Rowling</author> (元素節點)
lang="en" (屬性節點) 

基本值(或稱原子值,Atomic value)

基本值是無父或者無子的節點

上面XML文件中基本值的例子:

J K. Rowling
"en"

Xpath節點關係

父(Parent)

每個元素以及屬性都有一個父。

在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:

<book>
 <title>Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>

子(Children)

元素節點可有零個、一個或多個子。

在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:

<book>
 <title>Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>

同胞(Sibling)

擁有相同的父的節點

在下面的例子中,title、author、year 以及 price 元素都是同胞:

<book>
 <title>Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>

先輩(Ancestor)

某節點的父、父的父,等等。

在下面的例子中,title 元素的先輩是 book 元素和 bookstore 元素:

<bookstore>

<book>
 <title>Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>

</bookstore>

後代(Descendant)

某個節點的子,子的子,等等。

在下面的例子中,bookstore 的後代是 book、title、author、year 以及 price 元素:

<bookstore>

<book>
 <title>Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>

</bookstore>

Xpath語法

XPath 使用路徑表示式來選取 XML 文件中的節點或節點集。節點是通過沿著路徑 (path) 或者步 (steps) 來選取的。

XML示例

<?xml version="1.0" encoding="UTF-8"?>
 
<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>

選取節點

XPath 使用路徑表示式在 XML 文件中選取節點。節點是通過沿著路徑或者 step 來選取的。 下面列出了最有用的路徑表示式:

表示式 描述
nodename 選取此節點的所有子節點
/ 從根節點選取(取子節點)
// 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置(取子孫節點)
. 選取當前節點
.. 選取當前節點的父節點
@ 選取屬性

在下面的表格中,已列出了一些路徑表示式以及表示式的結果:

路徑表示式 結果
bookstore 選取 bookstore 元素的所有子節點
/bookstore 選取根元素 bookstore。註釋:假如路徑起始於正斜槓( / ),則此路徑始終代表到某元素的絕對路徑!
bookstore/book 選取屬於 bookstore 的子元素的所有 book 元素
//book 選取所有 book 子元素,而不管它們在文件中的位置
bookstore//book 選擇屬於 bookstore 元素的後代的所有 book 元素,而不管它們位於 bookstore 之下的什麼位置
//@lang 選取名為 lang 的所有屬性

謂語(Predicates)

謂語用來查詢某個特定的節點或者包含某個指定的值的節點。

謂語被嵌在方括號中。

在下面的表格中,列出了帶有謂語的一些路徑表示式,以及表示式的結果:

路徑表示式 結果
/bookstore/book[1] 選取屬於 bookstore 子元素的第一個 book 元素。
/bookstore/book[last()] 選取屬於 bookstore 子元素的最後一個 book 元素。
/bookstore/book[last()-1] 選取屬於 bookstore 子元素的倒數第二個 book 元素。
/bookstore/book[position()<4] 選取最前面的三個屬於 bookstore 元素的子元素的 book 元素。
//title[@lang] 選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang='eng'] 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。
/bookstore/book[price>35.00] 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。
/bookstore/book[price>35.00]//title 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大於 35.00。

選取未知節點

XPath 萬用字元可用來選取未知的 XML 元素。

萬用字元 描述
* 匹配任何元素節點。
@* 匹配任何屬性節點。
node() 匹配任何型別的節點。

在下面的表格中,列出了一些路徑表示式,以及這些表示式的結果:

路徑表示式 結果
/bookstore/* 選取 bookstore 元素的所有子元素。
//* 選取文件中的所有元素。
//title[@*] 選取所有帶有屬性的 title 元素。

選取若干路徑

通過在路徑表示式中使用"|"運算子,您可以選取若干個路徑。

在下面的表格中,列出了一些路徑表示式,以及這些表示式的結果:

路徑表示式 結果
//book/title | //book/price 選取 book 元素的所有 title 和 price 元素。
//title | //price 選取文件中的所有 title 和 price 元素。
/bookstore/book/title | //price 選取屬於 bookstore 元素的 book 元素的所有 title 元素,以及文件中所有的 price 元素。

參考

https://www.runoob.com/xpath/xpath-tutorial.html

相關文章