XPath即爲XML路徑語言(XML Path Language),它是一種用來肯定XML文檔中某部分位置的語言。 XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力。 起初XPath的提出的初衷是將其做爲一個通用的、介於XPointer與XSL間的語法模型。 可是XPath很快的被開發者採用來看成小型查詢語言。 html
W3C網址: http://www.w3schools.com/XPath/ node
最多見的XPath表達式是路徑表達式(XPath這一名稱的另外一來源)。 web
路徑表達式是從一個XML節點(當前的上下文節點)到另外一個節點、或一組節點的書面步驟順序。 這些步驟以「/」字符分開,每一步有三個構成成分: chrome
節點測試(用於篩選節點位置和名稱) 瀏覽器
節點描述(用於篩選節點的屬性和子節點特徵) 數據結構
通常狀況下,咱們使用簡寫後的語法。雖然完整的軸描述是一種更加貼近人類語言, 利用天然語言的單詞和語法來書寫的描述方式,可是相比之下也更加羅嗦。 函數
/A/B/C |
在這裏選擇全部符合規矩的C節點:C節點必須是B的子節點(B/C), 同時B節點必須是A的子節點(A/B),而A是這個XML文檔的根節點(/A)。 此時的這種描述法相似於磁盤中文件的路徑(URI),從盤符開始順着一級一級的目錄最終找到文件。 測試
A//B/*[1] |
此時選擇的元素是:在B節點下的第一個節點(B/[1]),不論節點的名稱如何(); 而B節點必須出如今A節點內,不論和A節點之間相隔幾層節點(//B); 與此同時A節點還必須是當前節點的子節點(A,前邊沒有/)。 google
//A/B/C/*[2] |
在未縮寫語法裏,兩個上述範例能夠寫爲: spa
/child::A/child::B/child::C child::A/descendant-or-self::B/child::node()[1] |
在XPath的每一個步驟裏,經過完整的軸描述(例如:child或descendant-or-self)進行明確的指定, 而後使用::,它的後面跟着節點測試的內容,例如上面範例所示的A以及node()。
軸可定義相對於當前節點的節點集。
ancestor | 選取當前節點的全部先輩(父、祖父等)。 |
ancestor-or-self | 選取當前節點的全部先輩(父、祖父等)以及當前節點自己。 |
attribute | 選取當前節點的全部屬性 |
child | 選取當前節點的全部子元素 |
descendant | 選取當前節點的全部後代元素(子、孫等)。 |
descendant-or-self | 選取當前節點的全部後代元素(子、孫等)以及當前節點自己。 |
following | 選取文檔中當前節點的結束標籤以後的全部節點。 |
namespace | 選取當前節點的全部命名空間節點。 |
parent | 選取當前節點的父節點。 |
preceding | 選取文檔中當前節點的開始標籤以前的全部節點。 |
preceding-sibling | 選取當前節點以前的全部同級節點。 |
self | 選取當前節點。 |
幾個實例講解:
選取當前節點的全部book先輩以及當前節點(若是此節點是 book 節點)child::book | 選取全部屬於當前節點的子元素的 book 節點。 |
attribute::lang | 選取當前節點的 lang 屬性。 |
child:: | 選取當前節點的全部子元素。 |
attribute:: | 選取當前節點的全部屬性 |
child::text() | 選取當前節點的全部文本子節點 |
child::node() | 選取當前節點的全部子節點 |
descendant::book | 選取當前節點的全部book後代 |
ancestor::book | 選擇當前節點的全部book先輩 |
ancestor-or-self::book | |
child::*/child::price | 選取當前節點的全部price孫節點。 |
下面列出了可用在 XPath 表達式中的運算符:
| | 計算兩個節點集 | //book | //cd | 返回全部擁有 book 和 cd 元素的節點集 |
+ | 加法 | 6 + 4 | 10 |
- | 減法 | 6 – 4 | 2 |
乘法 | 6 4 | 24 | |
div | 除法 | 8 div 4 | 2 |
= | 等於 | price=9.80 | 若是 price 是 9.80,則返回 true。若是 price 是 9.90,則返回 false。 |
!= | 不等於 | price!=9.80 | 若是 price 是 9.90,則返回 true。若是 price 是 9.80,則返回 false。 |
< | 小於 | price<9.80 | 若是 price 是 9.00,則返回 true。若是 price 是 9.90,則返回 false。 |
<= | 小於或等於 | price<=9.80 | 若是 price 是 9.00,則返回 true。若是 price 是 9.90,則返回 false。 |
> | 大於 | price>9.80 | 若是 price 是 9.90,則返回 true。若是 price 是 9.80,則返回 false。 |
>= | 大於或等於 | price>=9.80 | 若是 price 是 9.90,則返回 true。若是 price 是 9.70,則返回 false。 |
or | 或 | price=9.80 or price=9.70 | 若是 price 是 9.80,則返回 true。若是 price 是 9.50,則返回 false。 |
and | 與 | price>9.00 and price<9.90 | 若是 price 是 9.80,則返回 true。若是 price 是 8.50,則返回 false。 |
有關數值的函數
函數 | 說明 |
---|---|
fn:number(arg) | 返回參數的數值。參數能夠是布爾值、字符串或節點集。例子:number(‘100′)結果:100 |
fn:abs(num) | 返回參數的絕對值。例子:abs(3.14) 結果:3.14例子:abs(-3.14) 結果:3.14 |
fn:ceiling(num) | 返回大於 num 參數的最小整數。例子:ceiling(3.14) 結果:4 |
fn:floor(num) | 返回不大於 num 參數的最大整數。例子:floor(3.14) 結果:3 |
fn:round(num) | 把 num 參數舍入爲最接近的整數。例子:round(3.14) 結果:3 |
有關字符串的函數
函數 | 說明 |
---|---|
fn:string(arg) | 返回參數的字符串值。參數能夠是數字、邏輯值或節點集。例子:string(314) 結果:」314″ |
fn:compare(comp1,comp2,collation) | 若是 comp1 小於 comp2,則返回 -1。類推例子:compare(‘ghi’, ‘ghi’) 結果:0 |
fn:concat(string,string,…) | 返回字符串的拼接。例子:concat(‘XPath ‘,’is ‘,’FUN!’) 結果:’XPath is FUN!’ |
fn:substring(string,start,len) | 返回從start位置開始的指定長度的子字符串。第一個字符的下標是 1。例子:substring(‘Beatles’,1,4) 結果:’Beat’ |
fn:string-length(string) | 返回指定字符串的長度。若是沒有 string 參數,則返回當前節點的字符串值的長度。例子:string-length(‘Beatles’) 結果:7 |
fn:normalize-space(string) | 刪除開頭和結尾空白,並把內部全部空白序列替換爲一個,而後返回結果。例子:normalize-space(‘ The XML ‘) 結果:’The XML’ |
fn:upper-case(string) | 把 string 參數轉換爲大寫。例子:upper-case(‘The XML’) 結果:’THE XML’ |
fn:lower-case(string) | 把 string 參數轉換爲小寫。例子:lower-case(‘The XML’) 結果:’the xml’ |
fn:contains(string1,string2) | 若是 string1 包含 string2,則返回 true,不然返回 false。例子:contains(‘XML’,’XM’) 結果:true |
fn:starts-with(string1,string2) | 若是 string1 以 string2 開始,則返回 true,不然返回 false。例子:starts-with(‘XML’,’X’) 結果:true |
fn:ends-with(string1,string2) | 若是 string1 以 string2 結尾,則返回 true,不然返回 false。例子:ends-with(‘XML’,’X’) 結果:false |
fn:substring-before(string1,string2) | 返回 string2 在 string1 中出現以前的子字符串。例子:substring-before(’12/10′,’/’) 結果:’12’ |
fn:substring-after(string1,string2) | 返回 string2 在 string1 中出現以後的子字符串。例子:substring-after(’12/10′,’/’) 結果:’10’ |
fn:matches(string,pattern) | 若是 string 參數匹配指定的模式,則返回 true,不然返回 false。例子:matches(「Merano」, 「ran」) 結果:true |
更多函數請參考: http://www.w3school.com.cn/xpath/xpath_functions.asp
* //span/../.././span * //bookstore/book[last()] * /DocText/WithQuads/Page/Word * record[field[@id='220' and @value='Red'] and field[@id='221' and @value='Large']] * /Root//Person[contains(Blog,'cn') and contains(@ID,'01')] * //tr[td[1] and td[2][contains(text(), "512M")]] * //td/following-sibling::td[1] * //td/preceding-sibling::td[1] * //td[starts-with(text(), "%s") and contains(text(), "disk:%sMB")]/following-sibling::td[2][contains(text(), "%s")] * //a/../following-sibling::td[8]/a[2] * //a[@class="pushstate-link" and not(@rel)] * //a[@rel="next" and not(contains(@class, "disabled"))] |
看完前面部分,這些的含義應該很容易能夠看懂了。恭喜你,基本的XPath已經沒問題了!
最後我還推薦一個chrome瀏覽器中很好用的xpath插件,名字叫PsychoXPath。
插件地址:PsychoXPath
基本使用方法,以google的首頁「Google 搜索」按鈕爲例:
高亮模式:
*. 而後右鍵選擇PsychoXPath->Test XPath(Highlight)
*. 以後輸入XPath路徑
*. 結果以下,被找到的頁面元素會被高亮顯示:
*. 控制檯模式:
還能夠在控制檯中調試xpath,這個跟上面一樣道理。只是此次選擇的是PsychoXPath->Test XPath(Console)模式就好了。