XPath 是一門在 XML 文檔中查找信息的語言。XPath 用於在 XML 文檔中經過元素和屬性進行導航。
XPath 含有超過 100 個內建的函數。這些函數用於字符串值、數值、日期和時間比較、節點和 QName 處理、序列處理、邏輯值等等。
XPath 是 W3C 標準,XPath 於 1999 年 11 月 16 日 成爲 W3C 標準。XPath 被設計爲供 XSLT、XPointer 以及其餘 XML 解析軟件使用。
在XPath 中,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、註釋以及文檔節點(或稱爲根節點)。
XML 文檔是被做爲節點樹來對待的。樹的根被稱爲文檔節點或者根節點。node
1、選取節點
經常使用的路徑表達式:
函數
表達式spa |
描述設計 |
實例orm |
|
nodenameci |
選取nodename節點的全部子節點文檔 |
xpath(‘//div’)字符串 |
選取了div節點的全部子節點string |
/it |
從根節點選取 |
xpath(‘/div’) |
從根節點上選取div節點 |
// |
選取全部的當前節點,不考慮他們的位置 |
xpath(‘//div’) |
選取全部的div節點 |
. |
選取當前節點 |
xpath(‘./div’) |
選取當前節點下的div節點 |
.. |
選取當前節點的父節點 |
xpath(‘..’) |
回到上一個節點 |
@ |
選取屬性 |
xpath(’//@calss’) |
選取全部的class屬性 |
2、謂詞:被嵌在方括號內,用來查找某個特定的節點或包含某個制定的值的節點
表達式 |
結果 |
xpath(‘/body/div[1]’) |
選取body下的第一個div節點 |
xpath(‘/body/div[last()]’) |
選取body下最後一個div節點 |
xpath(‘/body/div[last()-1]’) |
選取body下倒數第二個div節點 |
xpath(‘/body/div[positon()<3]’) |
選取body下前兩個div節點 |
xpath(‘/body/div[@class]’) |
選取body下帶有class屬性的div節點 |
xpath(‘/body/div[@class=」main」]’) |
選取body下class屬性爲main的div節點 |
xpath(‘/body/div[price>35.00]’) |
選取body下price元素值大於35的div節點 |
3、通配符:Xpath經過通配符來選取未知的XML元素
表達式 |
結果 |
xpath(’/div/*’) |
選取div下的全部子節點 |
xpath(‘/div[@*]’) |
選取全部帶屬性的div節點 |
4、取多個路徑:使用「 | 運算符能夠選取多個路徑
表達式 |
結果 |
xpath(‘//div|//table’) |
選取全部的div和table節點 |
5、Xpath軸:軸能夠定義相對於當前節點的節點集
軸名稱 |
表達式 |
描述 |
ancestor |
xpath(‘./ancestor::*’) |
選取當前節點的全部先輩節點(父、祖父) |
ancestor-or-self |
xpath(‘./ancestor-or-self::*’) |
選取當前節點的全部先輩節點以及節點自己 |
attribute |
xpath(‘./attribute::*’) |
選取當前節點的全部屬性 |
child |
xpath(‘./child::*’) |
返回當前節點的全部子節點 |
descendant |
xpath(‘./descendant::*’) |
返回當前節點的全部後代節點(子節點、孫節點) |
following |
xpath(‘./following::*’) |
選取文檔中當前節點結束標籤後的全部節點 |
following-sibing |
xpath(‘./following-sibing::*’) |
選取當前節點以後的兄弟節點 |
parent |
xpath(‘./parent::*’) |
選取當前節點的父節點 |
preceding |
xpath(‘./preceding::*’) |
選取文檔中當前節點開始標籤前的全部節點 |
preceding-sibling |
xpath(‘./preceding-sibling::*’) |
選取當前節點以前的兄弟節點 |
self |
xpath(‘./self::*’) |
選取當前節點 |
6、功能函數:使用功能函數可以更好的進行模糊搜索
函數 |
用法 |
解釋 |
starts-with |
xpath(‘//div[starts-with(@id,」ma」)]‘) |
選取id值以ma開頭的div節點 |
contains |
xpath(‘//div[contains(@id,」ma」)]‘) |
選取id值包含ma的div節點 |
and |
xpath(‘//div[contains(@id,」ma」) and contains(@id,」in」)]‘) |
選取id值包含ma和in的div節點 |
text() |
xpath(‘//div[contains(text(),」ma」)]‘) |
選取節點文本包含ma的div節點 |
7、經常使用函數: 一、精肯定位(1)contains(str1,str2)用來判斷str1是否包含str2例1://*[contains(@class,'c-summaryc-row ')]選擇@class值中包含c-summary c-row的節點例2://div[contains(.//text(),'價格')]選擇text()中包含價格的div節點(2)position()選擇當前的第幾個節點例1://*[@class='result'][position()=1]選擇@class='result'的第一個節點例2://*[@class='result'][position()<=2]選擇@class='result'的前兩個節點(3)last()選擇當前的倒數第幾個節點例1://*[@class='result'][last()]選擇@class='result'的最後一個節點例2://*[@class='result'][last()-1]選擇@class='result'的倒數第二個節點(4)following-sibling 選取當前節點以後的全部同級節點例1://div[@class='result']/following-sibling::div選擇@class='result'的div節點後全部同級div節點找到多個節點時可經過position肯定第幾個如://div[@class='result']/following-sibling::div[position()=1](5)preceding-sibling 選取當前節點以前的全部同級節點使用方法同following-sibling 二、過濾信息(1)substring-before(str1,str2)用於返回字符串str1中位於第一個str2以前的部分例子:substring-before(.//*[@class='c-more_link']/text(),'條') 返回.//*[@class='c-more_link']/text()中第一個'條'前面的部分,若是不存在'條',則返回空值(2)substring-after(str1,str2)跟substring-before相似,返回字符串str1中位於第一個str2以後的部分例1:substring-after(.//*[@class='c-more_link']/text(),'條')返回.//*[@class='c-more_link']/text()中第一個’條’後面的部分,若是不存在'條',則返回空值例2:substring-after(substring-before(.//*[@class='c-more_link']/text(),'新聞'),'條') 返回.//*[@class='c-more_link']/text()中第一個'新聞'前面與第一個'條'後面之間的部分(3)normalize-space()用來將一個字符串的頭部和尾部的空白字符刪除,若是字符串中間含有多個連續的空白字符,將用一個空格來代替例子:normalize-space(.//*[contains(@class,'c-summaryc-row ')])(4)translate(string,str1,str2) 假如string中的字符在str1中有出現,那麼替換爲str1對應str2的同一位置的字符,假如str2這個位置取不到字符則刪除string的該字符例子:translate('12:30','03','54')結果:'12:45'三、拼接信息(1)concat()函數用於串連多個字符串例子:concat('http://baidu.com',.//*[@class='c-more_link']/@href)