標籤:xpath
何為良藥?
由於在XML中存在一些問題和缺陷,針對這些問題就產生了響應的解決方案。如:
getElementById方法在解析XML時由於一些原因適不適合的:
首先XML中每個元素節點不一定有id屬性。
其次XML中的兩個元素節點可能有相同的id屬性,這樣getElementById這個方法就不再能保證找到我們需要的唯一節點了。針對這個原因Xpath就誕生了。
Xpath是什嗎?
Xpath是如何產生的呢?它存在的必要是什麼呢?接下來就讓我們一一解答自己心中的疑問:
首先Xpath全稱是XML Path Language(XML路徑語言),適用於確定XML文檔中某節點位置的語言。XPath是 W3C XSLT 標準的主要元素,並且 XQuery 和 XPointer 都構建於 XPath 表達之上。因此,對 XPath 的理解是很多進階 XML應用的基礎。
我們可以把它當作類似於SQL一樣的查詢語言,通過給出的Xpath路徑資訊(就像SQL命令一樣)就可以從XML中尋找出合格節點(就像從資料庫中返回需要的資料一樣)
Xpath如何用?(XPath 路徑運算式詳解 )
一.路徑運算式文法
1.路徑 = 相對路徑 |絕對路徑
2.XPath路徑運算式 =步進運算式 | 相對路徑 "/"步進運算式。
3.步進運算式=軸 節點測試謂詞
說明:
1.其中軸表示步進運算式選擇的節點和當前上下文節點間的樹狀關係(層次關係),節點測試指定步進運算式選擇的節點名稱副檔名,謂詞即相當於過濾運算式以進一步過濾細化節點集。
2.謂詞可以是0個或多個。多個多個謂詞用邏輯操作符and,or串連。取邏輯非用not()函數。請看一個典型的XPath查詢運算式:/messages/message//child::node()[@id=0],其中/messages/message是路徑(絕對路徑以"/"開始),child::是軸表示在子節點下選擇,node()是節點測試表示選擇所有的節點。[@id=0]是謂詞,表示選擇所有有屬性id並且值為0的節點。
二.相對/絕對路徑
如果"/"處在XPath運算式開頭則表示文檔根項目(運算式中間作為分隔字元用以分割每一個步進運算式)如:/messages/message/subject是一種絕對路徑標記法,它表明是從文檔根開始尋找節點。假設當前節點是在第一個message節點【/messages/message[1]】,則路徑運算式subject(路徑前沒有"/")這種標記法稱為相對路徑,表明從當前節點開始尋找。具體請見下面所述的"運算式上下文"。
三.運算式上下文
上下文其實表示一種環境。以明確當前XPath路徑運算式處在什麼樣的環境下執行。例如同樣一個路徑運算式處在對根節點操作的環境和處在對某一個特定子節點操作的環境下執行所獲得的結果可能是完全不一樣的。也就是說XPath路徑運算式計算結果取決於它所處的上下文。
XPath上下文基本有以下幾種:
1.當前節點(./):
如./sender表示選擇當前節點下的sender節點集合(等同於下面所講的"特定元素",如:sender)
2.父節點(../):
如../sender表示選擇當前節點的父節點下的sender節點集合
3.根項目(/):
如/messages表示選擇從文檔根節點下的messages節點集合.
4.根節點(/*):
這裡的*是代表所有節點,但是根項目只有一個,所以這裡表示根節點。/*的返回結果和/messages返回的結果一樣都是messages節點。
5.遞迴下降(//):
如當前上下文是messages節點。則//sender將返回以下結果:
/messages//sender:
[email protected]
[email protected]
[email protected]
/messages/message[1]//sender:
[email protected]
[email protected]
我們可以看出XPath運算式返回的結果是:從當前節點開始遞迴步進搜尋當前節點下的所有子節點找到滿足條件的節點集。
6.特定元素
如sender:表示選擇當前節點下的sender節點集合,等同於(./sender)
注意:在執行XPath時一定要注意上下文。即當前是在哪個節點下執行XPath運算式。這在XMLDOM中很重要。如:在XMLDOM中的selectNodes,selectSingleNode方法的參數都是一個XPath運算式,此時這個XPath運算式的執行內容就是調用這個方法的節點及它所在的環境。
優點:
在IE6.0及其以上版本中我們可以使用同樣的方式來訪問任意深度的XML資料,這給XML資料的解析操作帶來了便利。
缺點:
在Firefox等瀏覽器中,則是使用了w3c標準的Xpath處理方式,沒有IE這麼簡單的方式。