網頁

2017/12/26

什麼是XPath

XPath (XML Path Language) 是一種用來尋找XML文件中某個節點(node)位置的查詢語言。

XPath使用類似路徑的語法來尋找節點。

XPath一共有七種節點:element, attribute, text, namespace, processing-instruction, comment, document

XML文件是由許多節點組成的樹狀結構,最上層的結點稱作root element

下面是一份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>
<!-- comment -->

在上面XML文件中的各節點如下

  • <?xml version="1.0" encoding="UTF-8"?>: processing-instruction node
  • <bookstore>: root element node
  • <author>: element node
  • lang="en": attribute node
  • Harry Potter: text node
  • <!-- comment -->: comment node

節點間的關係

Parent:element及attribute會有一個父節點(parent),例如<book><title><author><year><price>的parent。

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

Children:element可能會有零個,一個或多個子結點(children),例如上面<book>的children為<title><author><year><price>

Siblings:擁有共同parent的節點彼此為sibling,例如<title><author><year><price>彼此為siblings

Ancestors: 指一個節點的parent還有parent的parent等,例如下面<bookstore><book>皆為<title>的ancestors

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

Descendants: 指一個節點的children及children的children,例如上面<bookstore>的descendants包括<book>的children,<title><author><year><price>


XPath語法

範例XML文件如下

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

<bookstore>
  <book>
    <title lang="en">Harry Potter</title>
    <price>29.99</price>
  </book>
  <book>
    <title lang="en">Learning XML</title>
    <price>39.95</price>
  </book>
</bookstore>

XPath使用路徑表示來尋找節點,常用的語法如下

表示式 說明
nodename 選擇所有的<nodename>的節點
/ 從root node開始選取
// 選取目前節點下所有的節點
. 從目前的節點選取
.. 選取目前節點的parent
@ 選取attribute

範例

表示式 說明
bookstore 選擇所有的<bookstore>的節點
/bookstore 選取root element (<bookstore>)
bookstore/book 選取<bookstore>下所有children為book的節點
//book 選取所有位置的<book>節點
bookstore//book 選取bookstore下全部的book節點。
//@lang 選取所有attribute為lang的element

Predicates: Predicates是用來尋找包含指定值的節點。Predicates包在方括弧[]中。下面是一些使用範例。

Path 表示式 說明
/bookstore/book[1] 選取<bookstore>的children中第一個<book>
/bookstore/book[last()] 選取<bookstore>的children中最後一個<book>
/bookstore/book[last()-1] 選取<bookstore>的children中倒數第二個<book>
/bookstore/book[position()<3] 選取<bookstore>的children中前兩個<book>
//title[@lang] 選取全部含有lang屬性的<title>
//title[@lang='en'] 選取全部含有lang屬性且值為"en"<title>
/bookstore/book[price>35.00] 選取<bookstore>的children中的<book>,其下的<price>值大於35
/bookstore/book[price>35.00]/title 選取<bookstore>的children中的<book>,其下的<price>值大於35的<title>

XPath可利用萬用字元(wildcards)來選擇不確定的節點。

萬用字元 說明
* 匹配任意element節點
@* 匹配任意attribute節點
node() 匹配任意節點

使用萬用字元的一些範例

Path 表示式 說明
/bookstore/* 選擇<bookstore>下的所有children element節點
//* 選擇文件中的全部節點
//title[@*] 選擇文件中全部的<title>,其至少含有一個屬性

XPath可以使用|來選擇多個path

Path 表示式 說明
//book/title | //book/price 選擇所有<book>下的<title><price>
//title | //price 選擇文件中的全部的<title><price>
/bookstore/book/title | //price 選擇文件中<bookstore>中的<book>中的<title>,及全部的<price>

要找到網頁中某個element的XPath,在Chrome有一個叫XPath Helper的擴充工具,打開後按住shift然後將滑鼠游標移到網頁上即可顯示該element的XPath。



恩...抄得很累,不過至少有個印象:p


參考:

1 則留言: