XPath
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。
簡介[ ]
XPath 是一門在 XML 文檔中查找信息的語言。XPath 用于在 XML 文檔中通過元素和屬性進行導航。
什么是 XPath?
- XPath 使用路徑表達式在 XML 文檔中進行導航
- XPath 包含一個標準函數庫
- XPath 是 XSLT 中的主要元素
- XPath 是一個 W3C 標準
XPath 表示法[ ]
最常見的XPath表達式是路徑表達式(XPath這一名稱的另一來源)。路徑表達式是從一個XML節(jié)點(當前的上下文節(jié)點)到另一個節(jié)點、或一組節(jié)點的書面步驟順序。這些步驟以“/”字符分開,每一步有三個構成成分:
- 軸描述(用最直接的方式接近目標節(jié)點)
- 節(jié)點測試(用于篩選節(jié)點位置和名稱)
- 節(jié)點描述(用于篩選節(jié)點的屬性和子節(jié)點特征)
一般情況下,我們使用簡寫后的語法。雖然完整的軸描述是一種更加貼近人類語言,利用自然語言的單詞和語法來書寫的描述方式,但是相比之下也更加羅嗦。
簡寫后的語法最簡單的XPath如下:
- /A/B/C
在這里選擇所有符合規(guī)矩的C節(jié)點:C節(jié)點必須是B的子節(jié)點(B/C),同時B節(jié)點必須是A的子節(jié)點(A/B),而A是這個XML文檔的根節(jié)點(/A)。此時的這種描述法類似于磁盤中文件的路徑(URI),從盤符開始順著一級一級的目錄最終找到文件。
這里還有一個復雜一些的例子,包含了全部構成成分(請詳細的看):
- A//B/*[1]
此時選擇的元素是:在B節(jié)點下的第一個節(jié)點(B/*[1]),不論節(jié)點的名稱如何(*);而B節(jié)點必須出現在A節(jié)點內,不論和A節(jié)點之間相隔幾層節(jié)點(//B);與此同時A節(jié)點還必須是當前節(jié)點的子節(jié)點(A,前邊沒有/)。
啰嗦的語法在未縮寫語法里,兩個上述范例可以寫為:
- /child::A/child::B/child::C
- child::A/descendant-or-self::B/child::node()[1]
在XPath的每個步驟里,通過完整的軸描述(例如:child或descendant-or-self)進行明確的指定,然后使用::,它的后面跟著節(jié)點測試的內容,例如上面范例所示的A以及node()。
XPath 標準函數[ ]
XPath 含有超過 100 個內建的函數。這些函數用于字符串值、數值,日期和時間比較、節(jié)點和 QName 處理、序列處理、邏輯值等等。
XPath 節(jié)點[ ]
在 XPath 中,有七種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔節(jié)點(或稱為根節(jié)點)。
XPath 術語
節(jié)點(Node)
在 XPath 中,有七種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋以及文檔(根)節(jié)點。XML 文檔是被作為節(jié)點樹來對待的。樹的根被稱為文檔節(jié)點或者根節(jié)點。
XPath存取函數[ ]
名稱 說明
fn:node-name(node) 返回參數節(jié)點的節(jié)點名稱。
fn:nilled(node) 返回是否拒絕參數節(jié)點的布爾值。
fn:data(item.item,...) 接受項目序列,并返回原子值序列。
fn:base-uri()
fn:base-uri(node)
返回當前節(jié)點或指定節(jié)點的 base-uri 屬性的值。
fn:document-uri(node) 返回指定節(jié)點的 document-uri 屬性的值。
函數與運算符XPath[ ]
1.0定義四種數據型別:節(jié)點型(本身無序的節(jié)點組)、字符串型、數字型、與布爾型。
有效的運算符有:
- /、//以及..運算符,一般用于軸描述。
- 合集運算符 | 把兩個節(jié)點形成聯(lián)集。
- 布爾運算符 and、or以及not()函數
- 數學運算符 +、-、*、div(除)以及mod(取余數)
- 比較操作子 =、!=(不等于)、<、>、<=、>=
函數有:
- 文字運算函數
concat(), substring(), contains(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
- 數學運算函數
sum(), round(), floor(), ceiling()
- 節(jié)點屬性取得函數
name(), local-name(), namespace-uri()
- 處理上下文數據取得函數
position(), last()
- 類型轉換函數
string(), number(), boolean()
XPath 2.0[ ]
在W3C建議下,XPath 1.0于1999年11月16日發(fā)表。XPath 2.0目前正在W3C審核過程的最終階段。XPath 2.0表達了XPath語言在大小與能力上顯著的增加。
最值得大書特書的改變是XPath 2.0有了更豐富的型別系統(tǒng);XPath 2.0支持不可分割型態(tài),如在XML Schema內建型態(tài)定義一樣,并且也可自綱要(schema)導入用戶自定型別?,F在每個值都是一個序列(一個單一不可分割值或節(jié)點都被視為長度一的序列)。XPath 1.0節(jié)點組被節(jié)點序列取代,它可以是任何順序。
為了支持更豐富的型別組,XPath 2.0提供相當延展的函式與操作子群。
XPath 2.0實際上是XQuery 1.0的子集合。它提供了一個for表達式。該式是XQuery里“FLWOR”表達式的縮減版。利用列出XQuery省去的部分來描述該語言是可能的。主要范例是查詢前導語(query prolog)、元素和屬性建構式、“FLWOR”語法的余項式、以及typeswitch表達式。