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 nodelang="en": attribute nodeHarry 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 則留言:
感謝您 這篇超實用
張貼留言