XPath
| 編程範型 | 查詢語言 |
|---|---|
| 實作者 | W3C |
| 釋出時間 | 1998年 |
| 目前版本 |
|
| 受影響於 | |
| XSLT, XPointer | |
| 影響語言 | |
| XML Schema, XForms | |
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML檔案中某部分位置的電腦語言。
XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力[2][3]。起初XPath的提出的初衷是將其作為一個通用的、介於XPointer與XSL間的語法模型。但是XPath很快的被開發者採用來當作小型查詢語言。
表示法
[編輯]最常見的XPath表達式是路徑表達式(XPath這一名稱的另一來源)。路徑表達式是從一個XML節點(當前的上下文節點)到另一個節點、或一組節點的書面步驟順序。這些步驟以「/」字元分開,每一步有三個構成成分:
- 軸描述(用最直接的方式接近目標節點)
- 節點測試(用於篩選節點位置和名稱)
- 節點描述(用於篩選節點的屬性和子節點特徵)
一般情況下,我們使用簡寫後的語法。雖然完整的軸描述是一種更加貼近人類語言,利用自然語言的單詞和語法來書寫的描述方式,但是相比之下也更加羅嗦。
簡略的語法
[編輯]最簡單的XPath如下:
/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,前邊沒有/)。
擴充的語法
[編輯]在未縮簡語法裏,兩個上述範例可以寫為:
/child::A/child::B/child::Cchild::A/descendant-or-self::B/child::node()[1]
在XPath的每個步驟裏,通過完整的軸描述(例如:child或descendant-or-self)進行明確的指定,然後使用::,它的後面跟着節點測試的內容,例如上面範例所示的A以及node()。
軸描述語法
[編輯]軸描述元表示XML檔案分支樹表達式的瀏覽方向。這些坐標──包括全名及縮寫語法──列舉如下:
| 坐標 | 名稱 | 說明 | 縮寫語法 |
|---|---|---|---|
| child | 子節點 | 比自身節點深度大的一層的節點,且被包含在自身之內 | 預設,不需要 |
| attribute | 屬性 | @
| |
| descendant | 子孫節點 | 比自身節點深度大的節點,且被包含在自身之內 | 不提供 |
| descendant-or-self | 自身參照及子孫節點 | //
| |
| parent | 父節點 | 比自身節點深度小一層的節點,且包含自身 | ..
|
| ancestor | 祖先節點 | 比自身節點深度小的節點,且包含自身 | 不提供 |
| ancestor-or-self | 自身參照及祖先節點 | 不提供 | |
| following | 下文節點 | 按縱軸視圖,在此節點後的所有完整節點,即不包含其祖先節點 | 不提供 |
| preceding | 前文節點 | 按縱軸視圖,在此節點前的所有完整節點,即不包含其子孫節點 | 不提供 |
| following-sibling | 下一個同級節點 | 不提供 | |
| preceding-sibling | 上一個同級節點 | 不提供 | |
| self | 自己 | .
| |
| namespace | 名稱空間 | 不提供 |
關於使用attribute坐標簡寫語法的一個範例,//a/@href在檔案樹里任何地方的元素下選擇了一個叫href的屬性。self坐標最通常與述語同用,以參考現行選定節點。例如,h3[.='See also']在現行上下文選取了叫h3的元素,該元素文字內容是See also。
如果需要了解更多,請檢視ZVON.org給出的XPath幫助 (頁面存檔備份,存於互聯網檔案館)
節點測試
[編輯]節點測試包括特定節點名或者更一般的表達式。至於XML里命名空間字首gs已定義的檔案,//gs:enquiry將找到所有在那命名空間里enquiry的節點。
其他節點格式:
- comment()
- 尋找XML註釋節點,例如
<!-- 注释 --> - text()
- 尋找某點的文字型別,例如
hello於<k>hello</k> - processing-instruction()
- 尋找XML處理指令如
<?php echo $a; ?>。在這個例子裏,將符合processing-instruction('php')會傳回值。 - node()
- 尋找所有點
節點描述
[編輯]節點描述為一個邏輯真假表達式,任何真假判斷表達式都可在節點後方括號里表示,這條件必須在XPath處理這個節點前先被滿足。在某一步驟可有多少個描述並沒有限制。
範例如下:
//a[@href='help.php'],這將檢查元素a有沒有href屬性,並且該它的值是help.php。
複雜一些的範例如下:
//a[@href='help.php'][../div/@class='header']/@target
或
//a[@href='help.php'][name(..)='div'][../@class='header']/@target
此例將會選擇符合條件的元素a的target屬性。
要求元素a:
- 具有屬性
href且值為help.php; - 並且元素
a具有父元素div; - 並且父元素(
div)其自身具備class屬性,值為header。
函數與運算子
[編輯]XPath 1.0定義四種數據型別:節點型(本身無序的節點組)、字串型、數字型、與布林型。
有效的運算子有:
/、//以及..運算子,一般用於軸描述。- 合集運算子 | 把兩個節點形成聯集。
- 布林運算子and、or以及not()函數
- 數學運算子 +、-、*、div(除)以及mod(取餘數)
- 比較運算子 =、!=(不等於)、<、>、<=、>=
函數有:
- 文字運算函數
- concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
- 數學運算函數
- sum(), round(), floor(), ceiling()
- 節點屬性取得函數
- name(), local-name(), namespace-uri()
- 處理上下文數據取得函數
- position(), last()
- 類型轉換函數
- string(), number(), boolean()
某些常用的函數詳列如下。完整明細請參照W3C建議書。
節點組函數
[編輯]- position()
- 返回當前節點集合內,該節點的位置。
- count(node-set)
- 返回符合XPath的節點集合的節點總數。
字串函數
[編輯]- string(object?)
- 根據內建法則轉換任何四種XPath數據型別為字串。參數可為XPath,此時符合條件的節點(群)被轉換成字串返回。
- concat(string, string, string*)
- 連結任何數量的字串。
- contains(s1, s2)
- 如果
s1包含s2返回真。 - normalize-space(string?)
- 所有在字串頭和尾的空白字元都被移除,或者將字元間兩個及以上的空白字元置換成單一空格。有些XML因列印關係被美化,但可能讓後來的字串處理結果不可靠,故使用此函數有時能很好地改善情況。
布林函數
[編輯]- not(boolean)
- 布林否運算函數。
數學運算函數
[編輯]- sum(node-set)
- 根據內建轉型規則,轉換所有XPath參數定義找到的節點字串值成為數字,然後返回這些數字總合
使用運算子:=, !=, <=, <, >=和>的表達式可以創造於術語內。布林表達式可用括號()、布林運算子and與or、和/或者上述的not()函數聯合起來。數值計算使用*, +, -, div和mod。字串可包含任何Unicode字元。
述語內外,整個節點組可利用"|"字元聯合起來。
v[x or y] | w[z]會返回單一節點組,包括現行上下文找到的所有擁有x或y子元素的v元素、有z子元素的w元素。
//item[@price > 2*@discount]會選取price屬性至少兩倍於discount屬性數值的對象
XPath 2及XPath 3
[編輯]在W3C建議下[4],XPath 1.0於1999年11月16日發表。XPath 2.0於2007年1月23日成為W3C推薦標準。XPath 2.0表達了XPath語言在大小與能力上顯著的增加。
最值得大書特書的改變是XPath 2.0有了更豐富的型別系統;XPath 2.0支援不可分割型態,如在XML Schema內建型態定義一樣,並且也可自綱要(schema)匯入用戶自訂型別。現在每個值都是一個序列(一個單一不可分割值或節點都被視為長度一的序列)。XPath 1.0節點組被節點序列取代,它可以是任何順序。
為了支援更豐富的型別組,XPath 2.0提供相當延展的函數與運算子群。
XPath 2.0實際上是XQuery 1.0的子集合。它提供了一個for表達式。該式是XQuery里「FLWOR」表達式的縮減版。利用列出XQuery省去的部分來描述該語言是可能的。主要範例是查詢前導語(query prolog)、元素和屬性建構式、「FLWOR」語法的餘項式、以及typeswitch表達式。
XPath 3.0於2014年4月8日成為W3C推薦標準,而XPath3.1則於2017年3月21日成為W3C推薦標準。
參看
[編輯]參照
[編輯]- ^ https://www.w3.org/TR/xpath-31/.
- ^ Bergeron, Randy. XPath—Retrieving Nodes from an XML Document. SQL Server Magazine. October 31, 2000 [February 24, 2011]. (原始內容存檔於July 26, 2010).
- ^ Pierre Geneves. Course: The XPath Language (PDF). October 2012 [2021-03-15]. (原始內容 (PDF)存檔於2021-04-14).
- ^ XML and Semantic Web W3C Standards Timeline (PDF). 2012-02-04 [2021-03-15]. (原始內容 (PDF)存檔於2013-04-24).
外部連結
[編輯]- W3C XPath1.0規範(英文)
- W3C XPath 2.0候選推薦(頁面存檔備份,存於互聯網檔案館)(英文)