天天看點

Xpath—解決這個問題的良藥

     因為在XML中存在一些問題和缺陷,針對這些問題就産生了響應的解決方式。如:

getElementById方法在解析XML時因為一些原因适不适合的:

        首先XML中每一個元素節點不一定有id屬性。

        其次XML中的兩個元素節點可能有同樣的id屬性。這樣getElementById這種方法就不再能保證找到我們須要的唯一節點了。

針對這個原因Xpath就誕生了。

    Xpath是怎樣産生的呢?它存在的必要是什麼呢?接下來就讓我們一一解答自己心中的疑問:

    首先Xpath全稱是XML Path Language(XML路徑語言)。适用于确定XML文檔中某節點位置的語言。XPath是 W3C XSLT 标準的主要元素。而且 XQuery 和 XPointer 都建構于 XPath 表達之上。

是以。對 XPath 的了解是非常多進階 XML應用的基礎。

    我們能夠把它當作類似于SQL一樣的查詢語言。通過給出的Xpath路徑資訊(就像SQL指令一樣)就能夠從XML中查找出符合條件的節點(就像從資料庫中傳回須要的資料一樣)

 一.路徑表達式文法

    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:

    我們能夠看出XPath表達式傳回的結果是:從目前節點開始遞歸步進搜尋目前節點下的全部子節點找到滿足條件的節點集。

  6.特定元素

    如sender:表示選擇目前節點下的sender節點集合,等同于(./sender)

注意:在運作XPath時一定要注意上下文。

即目前是在哪個節點下運作XPath表達式。這在XMLDOM中非常重要。

如:在XMLDOM中的selectNodes,selectSingleNode方法的參數都是一個XPath表達式,此時這個XPath表達式的運作上下文就是調用這種方法的節點及它所在的環境。

    在IE6.0及其以上版本号中我們能夠使用相同的方式來訪問随意深度的XML資料,這給XML資料的解析操作帶來了便利。

    在Firefox等浏覽器中。則是使用了w3c标準的Xpath處理方式。沒有IE這麼簡單的方式。