XPath
维基百科,自由的百科全书
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 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 元素的 target 屬性;符合要求 a 元素有 href 屬性且值為 help.php;并且 a 元素有父輩 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.0
在W3C建議下,XPath 1.0於1999年11月16日發表。XPath 2.0目前正在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表達式。
[编辑] 参看
[编辑] 外部链接
|
||||||||||||||
|
|||||||||||||||||||||||