xpath詳解總結(jié),很全面_第1頁
xpath詳解總結(jié),很全面_第2頁
xpath詳解總結(jié),很全面_第3頁
xpath詳解總結(jié),很全面_第4頁
xpath詳解總結(jié),很全面_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、經(jīng)常在工作中會使用到XPath的相關(guān)知識,但每次總會在一些關(guān)鍵的地方不記得或不太清楚,所以免不了每次總要查一些零碎的知識,感覺即很煩又浪費時間,所以對XPath歸納及總結(jié)一下。 在這篇文章中你將能學習到: · XPath簡介 · XPath 路徑表達式詳解 · XPath在DOM,XSLT及XQuery中的應(yīng)用 XPath簡介 XPath是W3C的一個標準。它最主要的目的是為了在XML1.0或XML1.1文檔節(jié)點樹中定位節(jié)點所設(shè)計。目前有XPath1.0和XPath2.0兩個版本。其中Xpath1.0是1999年成為W3C標準,而XPath2.0標準的確立是在20

2、07年。W3C關(guān)于XPath的英文詳細文檔請見:/TR/xpath20/ 。  XPath是一種表達式語言,它的返回值可能是節(jié)點,節(jié)點集合,原子值,以及節(jié)點和原子值的混合等。XPath2.0是XPath1.0的超集。它是對XPath1.0的擴展,它可以支持更加豐富的數(shù)據(jù)類型,并且XPath2.0保持了對XPath1.0的相對很好的向后兼容性,幾乎所有的XPath2.0的返回結(jié)果都可以和XPath1.0保持一樣。另外XPath2.0也是XSLT2.0和XQuery1.0的用于查詢定位節(jié)點的主表達式語言。XQuery1.0是對XPath2.0的擴展。關(guān)于在

3、XSLT和XQuery中使用XPath表達式定位節(jié)點的知識在后面的實例中會有所介紹。  在學習XPath之前你應(yīng)該對XML的節(jié)點,元素,屬性,原子值(文本),處理指令,注釋,根節(jié)點(文檔節(jié)點),命名空間以及對節(jié)點間的關(guān)系如:父(Parent),子(Children),兄弟(Sibling),先輩(Ancestor),后代(Descendant)等概念有所了解。這里不在說明。  XPath路徑表達式 在本小節(jié)下面的內(nèi)容中你將可以學習到: · 路徑表達式語法 · 相對/絕對路徑 · 表達式上下文 · 謂詞(篩選表達式)及軸的概念 

4、3; 運算符及特殊字符 · 常用表達式實例 · 函數(shù)及說明 這里給出一個實例Xml文件。下面的說明及實例都是基于該XML文件。 · 路徑表達式語法:  · 路徑 = 相對路徑 | 絕對路徑 · XPath路徑表達式 = 步進表達式 | 相對路徑 "/"步進表達式。 · 步進表達式=軸 節(jié)點測試 謂詞 說明: · 其中軸表示步進表達式選擇的節(jié)點和當前上下文節(jié)點間的樹狀關(guān)系(層次關(guān)系),節(jié)點測試指定步進表達式選擇的節(jié)點名稱擴展名,謂詞即相當于過濾表達式以進一步過濾細化節(jié)點集。 · 謂詞可以

5、是0個或多個。多個多個謂詞用邏輯操作符and, or連接。取邏輯非用not()函數(shù)。 請看一個典型的XPath查詢表達式:/messages/message/child:node()id=0,其中/messages/message是路徑(絕對路徑以"/"開始),child:是軸表示在子節(jié)點下選擇,node()是節(jié)點測試表示選擇所有的節(jié)點。id=0是謂詞,表示選擇所有有屬性id并且值為0的節(jié)點。 · 相對路徑與絕對路徑: 如果"/"處在XPath表達式開頭則表示文檔根元素,(表達式中間作為分隔符用以分割每一個步進表達式)如:/messages/m

6、essage/subject是一種絕對路徑表示法,它表明是從文檔根開始查找節(jié)點。假設(shè)當前節(jié)點是在第一個message節(jié)點【/messages/message1】,則路徑表達式subject(路徑前沒有"/")這種表示法稱為相對路徑,表明從當前節(jié)點開始查找。具體請見下面所述的"表達式上下文"。  · 表達式上下文(Context): 上下文其實表示一種環(huán)境。以明確當前XPath路徑表達式處在什么樣的環(huán)境下執(zhí)行。例如同樣一個路徑表達式處在對根節(jié)點操作的環(huán)境和處在對某一個特定子節(jié)點操作的環(huán)境下執(zhí)行所獲得的結(jié)果可能是完全不一樣的。也就是說XP

7、ath路徑表達式計算結(jié)果取決于它所處的上下文。  XPath上下文基本有以下幾種: · 當前節(jié)點(./): 如./sender表示選擇當前節(jié)點下的sender節(jié)點集合(等同于下面所講的"特定元素",如:sender) · 父節(jié)點(./): 如./sender表示選擇當前節(jié)點的父節(jié)點下的sender節(jié)點集合 · 根元素(/): 如/messages表示選擇從文檔根節(jié)點下的messages節(jié)點集合. · 根節(jié)點(/*): 這里的*是代表所有節(jié)點,但是根元素只有一個,所以這里表示根節(jié)點。/*的返回結(jié)果和/messages返回的結(jié)果

8、一樣都是messages節(jié)點。 · 遞歸下降(/): 如當前上下文是messages節(jié)點。則/sender將返回以下結(jié)果: /messages/sender : <sender>gkt1980</sender> <sender>111</sender> <sender>333</sender>  /messages/message1/sender: <sender>gkt1980</sender> <sender>111</sender>  我們

9、可以看出XPath表達式返回的結(jié)果是:從當前節(jié)點開始遞歸步進搜索當前節(jié)點下的所有子節(jié)點找到滿足條件的節(jié)點集。  · 特定元素 如sender:表示選擇當前節(jié)點下的sender節(jié)點集合,等同于(./sender) 注意:在執(zhí)行XPath時一定要注意上下文。即當前是在哪個節(jié)點下執(zhí)行XPath表達式。這在XMLDOM中很重要。如:在XMLDOM中的selectNodes,selectSingleNode方法的參數(shù)都是一個XPath表達式,此時這個XPath表達式的執(zhí)行上下文就是調(diào)用這個方法的節(jié)點及它所在的環(huán)境。更多信息請參見:/TR/xpath20

10、/ · 謂詞(篩選表達式)及軸的概念: XPath的謂詞即篩選表達式,類似于SQL的where子句. 軸名稱結(jié)果ancestor選取當前節(jié)點的所有先輩(父、祖父等)ancestor-or-self選取當前節(jié)點的所有先輩(父、祖父等)以及當前節(jié)點本身attribute選取當前節(jié)點的所有屬性child選取當前節(jié)點的所有子元素。descendant選取當前節(jié)點的所有后代元素(子、孫等)。descendant-or-self選取當前節(jié)點的所有后代元素(子、孫等)以及當前節(jié)點本身。following選取文檔中當前節(jié)點的結(jié)束標簽之后的所有節(jié)點。namespace選取當前節(jié)點的所有命名空間節(jié)點pa

11、rent選取當前節(jié)點的父節(jié)點。preceding直到所有這個節(jié)點的父輩節(jié)點,順序選擇每個父輩節(jié)點前的所有同級節(jié)點preceding-sibling選取當前節(jié)點之前的所有同級節(jié)點。self選取當前節(jié)點。 · 運算符及特殊字符: 運算符/特殊字符說明/ 此路徑運算符出現(xiàn)在模式開頭時,表示應(yīng)從根節(jié)點選擇。/ 從當前節(jié)點開始遞歸下降,此路徑運算符出現(xiàn)在模式開頭時,表示應(yīng)從根節(jié)點遞歸下降。. 當前上下文。. 當前上下文節(jié)點父級。* 通配符;選擇所有元素節(jié)點與元素名無關(guān)。(不包括文本,注釋,指令等節(jié)點,如果也要包含這些節(jié)點請用node()函數(shù)) 屬性名的前綴。* 選擇所有屬性,與名稱無

12、關(guān)。: 命名空間分隔符;將命名空間前綴與元素名或?qū)傩悦指簟? ) 括號運算符(優(yōu)先級最高),強制運算優(yōu)先級。 應(yīng)用篩選模式(即謂詞,包括"過濾表達式"和"軸(向前/向后)")。 下標運算符;用于在集合中編制索引。| 兩個節(jié)點集合的聯(lián)合,如:/messages/message/to | /messages/message/cc- 減法。div,浮點除法。and, or 邏輯運算。mod 求余。not()邏輯非=等于!=不等于特殊比較運算符< 或者 &lt; <= 或者 &lt;= > 或者 &gt; >=

13、或者 &gt;= 需要轉(zhuǎn)義的時候必須使用轉(zhuǎn)義的形式,如在XSLT中,而在XMLDOM的scripting中不需要轉(zhuǎn)義。 · 常用表達式實例:  /Document Root文檔根./*選擇文檔根下面的所有元素節(jié)點,即根節(jié)點(XML文檔只有一個根節(jié)點)/node()根元素下所有的節(jié)點(包括文本節(jié)點,注釋節(jié)點等)/text()查找文檔根節(jié)點下的所有文本節(jié)點/messages/messagemessages節(jié)點下的所有message節(jié)點/messages/message1messages節(jié)點下的第一個message節(jié)點/messages/message1/sel

14、f:node()第一個message節(jié)點(self軸表示自身,node()表示選擇所有節(jié)點)/messages/message1/node()第一個message節(jié)點下的所有子節(jié)點/messages/message1/*last()第一個message節(jié)點的最后一個子節(jié)點/messages/message1/last()Error,謂詞前必須是節(jié)點或節(jié)點集/messages/message1/node()last()第一個message節(jié)點的最后一個子節(jié)點/messages/message1/text()第一個message節(jié)點的所有子節(jié)點/messages/message1/text()第一

15、個message節(jié)點下遞歸下降查找所有的文本節(jié)點(無限深度)/messages/message1 /child:node() /messages/message1 /node() /messages/messageposition()=1/node() /messageid=1 /node()第一個message節(jié)點下的所有子節(jié)點/messageid=1 /child:node()遞歸所有子節(jié)點(無限深度)/messageposition()=1/node()選擇id=1的message節(jié)點以及id=0的message節(jié)點/messages/message1 /parent:*Messages

16、節(jié)點/messages/message1/body/attachments/parent:node() /messages/message1/body/attachments/parent:* /messages/message1/body/attachments/.attachments節(jié)點的父節(jié)點。父節(jié)點只有一個,所以node()和* 返回結(jié)果一樣。 (.也表示父節(jié)點. 表示自身節(jié)點)/messageid=0/ancestor:*Ancestor軸表示所有的祖輩,父,祖父等。 向上遞歸/messageid=0/ancestor-or-self:*向上遞歸,包含自身/messageid=0/

17、ancestor:node()對比使用*,多一個文檔根元素(Document root)/messages/message1/descendant:node() /messages/message1/node()遞歸下降查找message節(jié)點的所有節(jié)點/messages/message1/sender/following:*查找第一個message節(jié)點的sender節(jié)點后的所有同級節(jié)點,并對每一個同級節(jié)點遞歸向下查找。/messageid=1/sender/following-sibling:*查找id=1的message節(jié)點的sender節(jié)點的所有后續(xù)的同級節(jié)點。/messageid=1/d

18、atetime/date查找id=1的message節(jié)點的datetime節(jié)點的date屬性/messageid=1/datetimedate /message/datetimeattribute:date查找id=1的message節(jié)點的所有含有date屬性的datetime節(jié)點/messagedatetime查找所有含有datetime節(jié)點的message節(jié)點/message/datetime/attribute:* /message/datetime/attribute:node() /message/datetime/*返回message節(jié)點下datetime節(jié)點的所有屬性節(jié)點/mes

19、sage/datetimeattribute:* /message/datetimeattribute:node() /message/datetime* /message/datetimenode()選擇所有含有屬性的datetime節(jié)點/attribute:*選擇根節(jié)點下的所有屬性節(jié)點/messageid=0/body/preceding:node()順序選擇body節(jié)點所在節(jié)點前的所有同級節(jié)點。(查找順序為:先找到body節(jié)點的頂級節(jié)點(根節(jié)點),得到根節(jié)點標簽前的所有同級節(jié)點,執(zhí)行完成后繼續(xù)向下一級,順序得到該節(jié)點標簽前的所有同級節(jié)點,依次類推。) 注意:查找同級節(jié)點是順序查找,而不是

20、遞歸查找。/messageid=0/body/preceding-sibling:node()順序查找body標簽前的所有同級節(jié)點。(和上例一個最大的區(qū)別是:不從最頂層開始到body節(jié)點逐層查找。我們可以理解成少了一個循環(huán),而只查找當前節(jié)點前的同級節(jié)點)/messageid=1/*namespace:amazon查找id=1的所有message節(jié)點下的所有命名空間為amazon的節(jié)點。/namespace:*文檔中的所有的命名空間節(jié)點。(包括默認命名空間xmlns:xml)/messageid=0/books/*local-name()='book'選擇books下的所有的bo

21、ok節(jié)點, 注意:由于book節(jié)點定義了命名空間<amazone:book>.若寫成/messageid=0/books/book則查找不出任何節(jié)點。/messageid=0/books/*local-name()='book' and namespace-uri()='選擇books下的所有的book節(jié)點,(節(jié)點名和命名空間都匹配) /messageid=0/books/*local-name()='book'year>2006選擇year節(jié)點值>2006的book節(jié)點/messageid=0/books/*local-name

22、()='book'1/year>2006指示第一個book節(jié)點的year節(jié)點值是否大于2006. 返回xs:boolean: true · 函數(shù)及說明:  值得欣喜的是XPath函數(shù)和XSLT,XQuery等共享函數(shù)庫,函數(shù)庫為我們提供了功能豐富的各種函數(shù)的調(diào)用,我們也可以自定義自己的函數(shù)。這里不再對每個函數(shù)的用法逐一說明,英文好點的朋友直接去看看w3關(guān)于XPath函數(shù)的介紹吧:/TR/xquery-operators 。中文的可以參考這個網(wǎng)站,  XPath在DOM,XSLT及XQuery中的應(yīng)用

23、DOM: <!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Transitional/EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="/1999/xhtml"> <head> <title>XPath Test</title></head> <body>  <scrip

24、t language="javascript" type="text/javascript"> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false" xmlDoc.load("messages.xml"); xmlDoc.setProperty("SelectionLanguage", "XPath");     var

25、 sPath = "/messages/message1/books/*local-name()='book'" var bookNodes = xmlDoc.selectNodes(sPath);  document.write("<ul>"); for ( var i = 0; i < bookNodes.length; i+) document.write("<li>" + bookNodesi.childNodes0.text + "</li>"); document.write("</ul>"); </script>  </body> </html> 注意: 我們?nèi)羰褂胣ew ActiveXObject("Microsoft.XMLDOM")則需要注意的是:因為早期的XMLDO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論