XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。XPath 是 W3C XSLT 標準的主要元素,而且 XQuery 和 XPointer 同時被構建於 XPath 表達之上。所以,對 XPath 的理解是不少高級 XML 應用的基礎。 其實對些咱們並不陌生,最與XPath類似的即是CSS的選擇器.在CSS中使用CSS選擇符選擇元素來應用樣式,而在XSLT中則使用XPath,XPath與CSS選擇器相好比強大的許多!下面是CSS選擇符與XPath選擇符一些對照:node
//CSS選擇符
body p //選擇全部body下面的p元素
body>p //選擇body的子元素p
* //選擇全部的元素
//與之對應的XPath選擇符
body//p
body/p
*
雖然如今還不能瞭解這些XPath表達的含意,但能夠發現,它和CSS選擇符十分相像!但XPath有更強大的地方,好比它能夠定位到body元素下具體位置上的p或能夠選擇前N個p:數組
body/p[position()=4] //這個XPath表達式將選取body子元素中第4個p元素,注意這裏從1開始計數
body/p[position()<3] //將選取body子元素中前兩個p元素
XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和咱們在常規的電腦文件系統中看到的表達式很是類似。另外,XPath 含有超過 100 個內建的函數。這些函數用於字符串值、數值,日期和時間比較、節點和 QName 處理、序列處理、邏輯值等等。瀏覽器
XPath使用路徑表達式在 XML 文檔中選取節點。節點是經過沿着路徑(path)或者 步(step) 來選取的。如"/"表示文檔節點,"."表示當前節點,而".."則表示當前節點的父節點.示例:函數
{由於XPath表示達式中有斜槓,因此暫時用這個表示註釋!
/ {選取文檔節點,nodeType爲9
/root {選取文檔根元素,相似於文件系統的路徑(Unix),以/開頭的路徑都是絕對路徑
/root/child/.. {選取根節點root的子節點child的父節點(就是root)
下面是一些經常使用路徑表達式測試
<?xml version="1.0"?> <root> <child attr="attr" /> <child> <a><desc /></a> </child> </root>
{針對上面的XML文檔的XPath結果,當前節點爲document
/root {選取root
root {選取root
child {空,由於child不是document的子元素
//child {選取兩個child元素,//表示後代
//@attr {選取attr屬性節點
/root/child//desc {返回child的後代元素desc
謂語用於在查找節點時提供更詳盡的信息,謂語被嵌在方括號中。下面是一些帶有謂語的XPath表達式:lua
/root/child[3] {選取root元素的第三個child子元素,注意,這和數組下標不同,從1開始計數 //child[@attr] {選取全部具備屬性attr的child元素 //child[@attr="val"]/desc {選取全部屬性attr的值爲val的child元素的子元素desc //child[desc] {選取全部的有desc子元素的child //child[position()>3] {position()是XPath中的一個函數,表示節點的位置 //child[@attr>12] {XPath表達式還能夠進行數值比較,該表達式將選取attr屬性值大於12的child元素 //child[last()] {last()函數返回節點列表最後的位置,該表達式將選取最後一個child元素
XPath 通配符可用來選取未知的 XML 元素。spa
/root/* {選取根元素下面的全部子元素 /root/node() {選取根元素下面的全部節點,包括文本節點 //* {選取文檔中全部元素 //child[@*] {選取全部具備屬性的child元素 //@* {選取全部的屬性節點
與CSS中使用逗號組合使用多個選擇符同樣,XPath支持一種使用"|"來組合多個路徑的語法!code
/root | /root/child {選取根元素root與它下面的子元素child //child | //desc {選取全部的child元素與desc元素
下面列出了可用在 XPath 表達式中的運算符:xml
軸可定義某個相對於當前節點的節點集。下面一可用的軸名稱與對應的結果:對象
事實上,一個完整的XPath表達式由"/"與"步"構成的,而步又是由 "軸" 、 "節點測試"和"謂語"構成的.以下:
step/step/..... {一個XPath表達式 {step的構成 軸名稱::節點測試[謂語]
在通常的XPath表達式中,沒有謂語即表達沒有其它條件限制,而沒有軸名稱,則默認使用child.如"abc"與"child::abc"是等效的, 下面是一些與使用軸名稱等效的簡單XPath表達式:
XPath還包含一套函數庫,如position與last就是函數,通常的函數被用在謂語中,而在XSLT及XQuery中它們則獲得了更普遍的使用.
IE瀏覽器對XPath的實現比較簡單.一個XML DOM對象(及每一個節點)都有selectSingleNode與selectNodes方法,傳入XPath表達式,selectNodes返回匹配的節點列表,而selectSingleNode則只返回列表中第一個項目!
var xmlDom = getXMLDOM();//咱們以前寫的跨瀏覽器的XML DOM加載函數 loadXMLFile(xmlDom,"text.xml"); var root = xmlDom.selectSingleNode("/*");//返回文檔根元素 root = xmlDom.selectNodes("/*")[0];//同上 var lastChild = xmlDom.selectSingleNode("/*/*[last()]");
Mozilla是根據DOM標準來實現對XPath的支持的。DOM Level 3附加標準DOM Level 3 XPath定義了用於在DOM中計算XPath表達式的接口。遺憾的是,這個標準要比微軟直觀的方式複雜得多。
雖然有好多與XPath相關的對象,最重要的兩個是:XPathEvaluator和XPathResult。XPathEvaluator利用方法evaluate()計算XPath表達式。
evaluate()方法有五個參數:XPath表達式、上下文節點、命名空間解釋程序和返回的結果的類型,同時,在XPathResult中存放結果(一般爲null)。
命名空間解釋程序,只有在XML代碼用到了XML命名空間時纔是必要的,因此一般留空,置爲null。返回結果的類型,能夠是如下十個常量值之一:
下面是使用ORDERED_NODE_ITERATOR_TYPE的例子:
var xmlDom = getXMLDOM();//咱們以前寫的跨瀏覽器的XML DOM加載函數 loadXMLFile(xmlDom,"text.xml"); var evaluator = new XPathEvaluator(); var result =evaluator.evaluate("/root",xmlDom,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null); var node; if (result) {//執行失敗會返回null while(node=result.iterateNext()) {//這個列表必須使用iterateNext方法遍歷 alert(node.tagName); } }