亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

Xpath語法格式總結

2024-09-05 20:53:48
字體:
來源:轉載
供稿:網友

經常在工作中會使用到XPath的相關知識,但每次總會在一些關鍵的地方不記得或不太清楚,所以免不了每次總要查一些零碎的知識,感覺即很煩又浪費時間,所以對XPath歸納及總結一下。

在這篇文章中你將能學習到:

XPath簡介

XPath 路徑表達式詳解

XPath在DOM,XSLT及XQuery中的應用

XPath簡介

XPath是W3C的一個標準。它最主要的目的是為了在XML1.0或XML1.1文檔節點樹中定位節點所設計。目前有XPath1.0和XPath2.0兩個版本。其中Xpath1.0是1999年成為W3C標準,而XPath2.0標準的確立是在2007年。W3C關于XPath的英文詳細文檔請見:http://www.w3.org/TR/xpath20/ 。

XPath是一種表達式語言,它的返回值可能是節點,節點集合,原子值,以及節點和原子值的混合等。XPath2.0是XPath1.0的超集。它是對XPath1.0的擴展,它可以支持更加豐富的數據類型,并且XPath2.0保持了對XPath1.0的相對很好的向后兼容性,幾乎所有的XPath2.0的返回結果都可以和XPath1.0保持一樣。另外XPath2.0也是XSLT2.0和XQuery1.0的用于查詢定位節點的主表達式語言。XQuery1.0是對XPath2.0的擴展。關于在XSLT和XQuery中使用XPath表達式定位節點的知識在后面的實例中會有所介紹。

在學習XPath之前你應該對XML的節點,元素,屬性,原子值(文本),處理指令,注釋,根節點(文檔節點),命名空間以及對節點間的關系如:父(Parent),子(Children),兄弟(Sibling),先輩(Ancestor),后代(Descendant)等概念有所了解。這里不在說明。

XPath路徑表達式

在本小節下面的內容中你將可以學習到:

路徑表達式語法

相對/絕對路徑

表達式上下文

謂詞(篩選表達式)及軸的概念

運算符及特殊字符

常用表達式實例

函數及說明

這里給出一個實例Xml文件。下面的說明及實例都是基于該XML文件。

<?xml version="1.0" encoding="UTF-8"?><!-- edited with XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) by Administrator --><?xml-stylesheet type="text/xsl" href="messages.xsl" rel="external nofollow" ?><messages> <message id="1"> <sender>gukaitong@gmail.com</sender> <to>anonymous@gmail.com <group name="IT"> <address>111@gmail.com</address> <address>222@gmail.com</address> <address>aaa@gmail.com</address> <address>bbb@gmail.com</address> <address>ccc@gmail.com</address> </group> </to> <subject>This is a sample</subject> <datetime date="2008-12-11" time="12:00:00" formatted="12/11/2008 12:00AM">2008-12-11T12:00:00Z</datetime> <body> Are you interested in?  <attachments> <attachment id="1">  <message id="0">  <sender>anonymous@gmail.com</sender>  <to>gukaitong@gmail.com</to>  <body>We strongly recommend the following books  <books xmlns:amazon="http://www.amazon.com/books/schema">  <amazon:book>   <name>Professional C# 2008 </name>   <country>USA</country>   <price>37.79</price>   <year>2007</year>  </amazon:book>  <amazon:book>   <name>Microsoft Visual C# 2008 Step by Step </name>   <country>USA</country>   <price>26.39 </price>   <year>2008</year>  </amazon:book>  <amazon:book>   <name>C# in Depth</name>   <country>USA</country>   <price>29.69 </price>   <year>2006</year>  </amazon:book>  <amazon:book>   <name>Thinking in Java</name>   <country>USA</country>   <price>23.69 </price>   <year>2004</year>  </amazon:book>  </books>  </body>  </message> </attachment> </attachments> </body> </message> <message id="2"> <sender>333@gmail.com</sender> <to>444@gmail.com</to> <subject>No title</subject> <body/> </message></messages>

路徑表達式語法:

路徑 = 相對路徑 | 絕對路徑

XPath路徑表達式 = 步進表達式 | 相對路徑 "/"步進表達式。

步進表達式=軸 節點測試 謂詞

說明:

其中軸表示步進表達式選擇的節點和當前上下文節點間的樹狀關系(層次關系),節點測試指定步進表達式選擇的節點名稱擴展名,謂詞即相當于過濾表達式以進一步過濾細化節點集。

謂詞可以是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(路徑前沒有"/")這種表示法稱為相對路徑,表明從當前節點開始查找。具體請見下面所述的"表達式上下文"。

表達式上下文(Context):

上下文其實表示一種環境。以明確當前XPath路徑表達式處在什么樣的環境下執行。例如同樣一個路徑表達式處在對根節點操作的環境和處在對某一個特定子節點操作的環境下執行所獲得的結果可能是完全不一樣的。也就是說XPath路徑表達式計算結果取決于它所處的上下文。

XPath上下文基本有以下幾種:

當前節點(./):

如./sender表示選擇當前節點下的sender節點集合(等同于下面所講的"特定元素",如:sender)
父節點(../):

如../sender表示選擇當前節點的父節點下的sender節點集合

根元素(/):

如/messages表示選擇從文檔根節點下的messages節點集合.

根節點(/*):

這里的*是代表所有節點,但是根元素只有一個,所以這里表示根節點。/*的返回結果和/messages返回的結果一樣都是

messages節點。

遞歸下降(//):

如當前上下文是messages節點。則//sender將返回以下結果:

/messages//sender :
<sender>gkt1980@gmail.com</sender>
<sender>111@gmail.com</sender>
<sender>333@gmail.com</sender>
/messages/message[1]//sender:
<sender>gkt1980@gmail.com</sender>
<sender>111@gmail.com</sender>

我們可以看出XPath表達式返回的結果是:從當前節點開始遞歸步進搜索當前節點下的所有子節點找到滿足條件的節點集。

特定元素

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

注意:在執行XPath時一定要注意上下文。即當前是在哪個節點下執行XPath表達式。這在XMLDOM中很重要。如:在XMLDOM中的selectNodes,selectSingleNode方法的參數都是一個XPath表達式,此時這個XPath表達式的執行上下文就是調用這個方法的節點及它所在的環境。更多信息請參見:http://www.w3.org/TR/xpath20/

謂詞(篩選表達式)及軸的概念:

XPath的謂詞即篩選表達式,類似于SQL的where子句.

軸名稱

結果

ancestor

選取當前節點的所有先輩(父、祖父等)

ancestor-or-self

選取當前節點的所有先輩(父、祖父等)以及當前節點本身

attribute

選取當前節點的所有屬性

child

選取當前節點的所有子元素。

descendant

選取當前節點的所有后代元素(子、孫等)。

descendant-or-self

選取當前節點的所有后代元素(子、孫等)以及當前節點本身。

following

選取文檔中當前節點的結束標簽之后的所有節點。

namespace

選取當前節點的所有命名空間節點

parent

選取當前節點的父節點。

preceding

直到所有這個節點的父輩節點,順序選擇每個父輩節點前的所有同級節點

preceding-sibling

選取當前節點之前的所有同級節點。

self

選取當前節點。

運算符及特殊字符:

運算符/特殊字符

說明

/

此路徑運算符出現在模式開頭時,表示應從根節點選擇。

//

從當前節點開始遞歸下降,此路徑運算符出現在模式開頭時,表示應從根節點遞歸下降。

.

當前上下文。

..

當前上下文節點父級。

*

通配符;選擇所有元素節點與元素名無關。(不包括文本,注釋,指令等節點,如果也要包含這些節點請用node()函數)

@

屬性名的前綴。

@*

選擇所有屬性,與名稱無關。

:

命名空間分隔符;將命名空間前綴與元素名或屬性名分隔。

( )

括號運算符(優先級最高),強制運算優先級。

[ ]

應用篩選模式(即謂詞,包括"過濾表達式"和"軸(向前/向后)")。

[ ]

下標運算符;用于在集合中編制索引。

|

兩個節點集合的聯合,如://messages/message/to | //messages/message/cc

-

減法。

div,

浮點除法。

and, or

邏輯運算。

mod

求余。

not()

邏輯非

=

等于

!=

不等于

特殊比較運算符

< 或者 &lt;

<= 或者 &lt;=

> 或者 &gt;

>= 或者 &gt;=

需要轉義的時候必須使用轉義的形式,如在XSLT中,而在XMLDOM的scripting中不需要轉義。

常用表達式實例:

/

Document Root文檔根.

/*

選擇文檔根下面的所有元素節點,即根節點(XML文檔只有一個根節點)

/node()

根元素下所有的節點(包括文本節點,注釋節點等)

/text()

查找文檔根節點下的所有文本節點

/messages/message

messages節點下的所有message節點

/messages/message[1]

messages節點下的第一個message節點

/messages/message[1]/self::node()

第一個message節點(self軸表示自身,node()表示選擇所有節點)

/messages/message[1]/node()

第一個message節點下的所有子節點

/messages/message[1]/*[last()]

第一個message節點的最后一個子節點

/messages/message[1]/[last()]

Error,謂詞前必須是節點或節點集

/messages/message[1]/node()[last()]

第一個message節點的最后一個子節點

/messages/message[1]/text()

第一個message節點的所有子節點

/messages/message[1]//text()

第一個message節點下遞歸下降查找所有的文本節點(無限深度)

/messages/message[1] /child::node()

/messages/message[1] /node()

/messages/message[position()=1]/node()

//message[@id=1] /node()

第一個message節點下的所有子節點

//message[@id=1] //child::node()

遞歸所有子節點(無限深度)

//message[position()=1]/node()

選擇id=1的message節點以及id=0的message節點

/messages/message[1] /parent::*

Messages節點

/messages/message[1]/body/attachments/parent::node()

/messages/message[1]/body/attachments/parent::* /messages/message[1]/body/attachments/..

attachments節點的父節點。父節點只有一個,所以node()和* 返回結果一樣。

(..也表示父節點. 表示自身節點)

//message[@id=0]/ancestor::*

Ancestor軸表示所有的祖輩,父,祖父等。

向上遞歸

//message[@id=0]/ancestor-or-self::*

向上遞歸,包含自身

//message[@id=0]/ancestor::node()

對比使用*,多一個文檔根元素(Document root)

/messages/message[1]/descendant::node()

//messages/message[1]//node()

遞歸下降查找message節點的所有節點

/messages/message[1]/sender/following::*

查找第一個message節點的sender節點后的所有同級節點,并對每一個同級節點遞歸向下查找。

//message[@id=1]/sender/following-sibling::*

查找id=1的message節點的sender節點的所有后續的同級節點。

//message[@id=1]/datetime/@date

查找id=1的message節點的datetime節點的date屬性

//message[@id=1]/datetime[@date]

//message/datetime[attribute::date]

查找id=1的message節點的所有含有date屬性的datetime節點

//message[datetime]

查找所有含有datetime節點的message節點

//message/datetime/attribute::*

//message/datetime/attribute::node()

//message/datetime/@*

返回message節點下datetime節點的所有屬性節點

//message/datetime[attribute::*]

//message/datetime[attribute::node()]

//message/datetime[@*]

//message/datetime[@node()]

選擇所有含有屬性的datetime節點

//attribute::*

選擇根節點下的所有屬性節點

//message[@id=0]/body/preceding::node()

順序選擇body節點所在節點前的所有同級節點。(查找順序為:先找到body節點的頂級節點(根節點),得到根節點標簽前的所有同級節點,執行完成后繼續向下一級,順序得到該節點標簽前的所有同級節點,依次類推。)

注意:查找同級節點是順序查找,而不是遞歸查找。

//message[@id=0]/body/preceding-sibling::node()

順序查找body標簽前的所有同級節點。(和上例一個最大的區別是:不從最頂層開始到body節點逐層查找。我們可以理解成少了一個循環,而只查找當前節點前的同級節點)

//message[@id=1]//*[namespace::amazon]

查找id=1的所有message節點下的所有命名空間為amazon的節點。

//namespace::*

文檔中的所有的命名空間節點。(包括默認命名空間xmlns:xml)

//message[@id=0]//books/*[local-name()='book']

選擇books下的所有的book節點,

注意:由于book節點定義了命名空間<amazone:book>.若寫成//message[@id=0]//books/book則查找不出任何節點。

//message[@id=0]//books/*[local-name()='book' and namespace-uri()='http://www.amazon.com/books/schema']

選擇books下的所有的book節點,(節點名和命名空間都匹配)

//message[@id=0]//books/*[local-name()='book'][year>2006]

選擇year節點值>2006的book節點

//message[@id=0]//books/*[local-name()='book'][1]/year>2006

指示第一個book節點的year節點值是否大于2006.

返回xs:boolean: true

函數及說明:

值得欣喜的是XPath函數和XSLT,XQuery等共享函數庫,函數庫為我們提供了功能豐富的各種函數的調用,我們也可以自定義自己的函數。這里不再對每個函數的用法逐一說明,中文的可以參考這個網站, http://www.49028c.com/w3school/xpath/index.htm

XPath在DOM,XSLT及XQuery中的應用

DOM:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>XPath Test</title></head><body><script language="javascript" type="text/javascript">var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async="false";xmlDoc.load("messages.xml");xmlDoc.setProperty("SelectionLanguage", "XPath"); var sPath = "/messages/message[1]//books/*[local-name()='book']";var bookNodes = xmlDoc.selectNodes(sPath);document.write("<ul>");for ( var i = 0; i < bookNodes.length; i++) {document.write("<li>" + bookNodes[i].childNodes[0].text + "</li>");}document.write("</ul>");</script></body></html>

注意:

我們若使用new ActiveXObject("Microsoft.XMLDOM")則需要注意的是:因為早期的XMLDOM的SelectionLanguage屬性默認是正則表達式,不是XPath語言。所以需要指定這樣一條語句xmlDoc.setProperty("SelectionLanguage", "XPath"); 以支持XPath查詢表達式。.

若沒有指定SelectionLanguage屬性值為XPath則要注意以下情況:

數組下標從0開始(我們知道在XPath查詢表達式中數組下標是從1開始的)不支持在XPath查詢表達式中使用XPath函數。

總結

以上就是本文關于Xpath語法格式總結的全部內容,希望對大家有所幫助。感興趣的朋友可以參閱:MYSQL updatexml()函數報錯注入解析、OGNL表達式基本語法與用法詳解、前端常見跨域解決方案(全)等,有什么問題可以隨時留言,歡迎大家討論交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情亚洲综合一区| 久久午夜a级毛片| 91精品久久久久久久久久久久久| 久久青草精品视频免费观看| 成人在线精品视频| 国产精品av免费在线观看| 久久久视频在线| 国产精品偷伦视频免费观看国产| 欧美视频免费在线观看| 国产精品久久久一区| 91麻豆国产精品| 日韩免费精品视频| 精品五月天久久| 亚洲精品www久久久久久广东| 国产精品高潮呻吟久久av野狼| 黑人狂躁日本妞一区二区三区| 欧美成年人视频网站| 亚洲美女免费精品视频在线观看| 亚洲国产精品va| 菠萝蜜影院一区二区免费| 亚洲伊人一本大道中文字幕| 久久精品国产清自在天天线| 久久精品视频在线观看| 国产成人小视频在线观看| 蜜臀久久99精品久久久无需会员| 国产精品高潮粉嫩av| 精品欧美一区二区三区| 国内精品久久久久久久| 日本不卡免费高清视频| www.午夜精品| 国产精品偷伦视频免费观看国产| 国产aⅴ夜夜欢一区二区三区| 亚洲人午夜色婷婷| 亚洲一区中文字幕在线观看| 欧美理论电影在线观看| 亚洲午夜未满十八勿入免费观看全集| 亚洲免费一级电影| 中文字幕一区电影| 亚洲专区在线视频| 亚洲在线视频福利| 久久久久一本一区二区青青蜜月| 中文字幕精品在线视频| 一本色道久久综合狠狠躁篇怎么玩| 欧美成人黑人xx视频免费观看| 久久久久久久国产精品| 国产日韩综合一区二区性色av| 色噜噜亚洲精品中文字幕| 欧美激情精品久久久久久黑人| 欧美激情在线狂野欧美精品| 国产一区av在线| 日韩精品在线免费观看| 亚洲国产中文字幕在线观看| 日本不卡高字幕在线2019| 色综合久久精品亚洲国产| 久久男人av资源网站| 中文字幕久久久av一区| 日韩免费观看在线观看| 欧美日韩精品在线视频| 欧美大成色www永久网站婷| 国产91色在线| 日韩中文字幕不卡视频| 亚洲男女性事视频| 91久久久久久久一区二区| 日韩在线中文字幕| 91香蕉嫩草影院入口| 亚洲国产精品va在线看黑人动漫| 国产精品美女免费视频| 国产成人综合一区二区三区| 中文字幕精品www乱入免费视频| 久久久最新网址| 欧美成人精品不卡视频在线观看| 国产精品视频精品视频| 亚洲国产天堂久久国产91| 亚洲曰本av电影| 韩剧1988免费观看全集| 亚洲另类激情图| 欧美一级成年大片在线观看| 亚洲娇小xxxx欧美娇小| 欧美亚洲午夜视频在线观看| 精品久久久一区二区| 成人国产精品av| 亚洲欧美日韩精品久久亚洲区| 久久久久久国产精品| 黑人巨大精品欧美一区免费视频| 亚洲国产高清福利视频| 国产成人黄色av| 久久久久国产一区二区三区| 精品久久久久久久久久ntr影视| 4444欧美成人kkkk| 国产视频综合在线| 日韩精品久久久久久福利| 久久精品成人欧美大片古装| 在线观看国产精品淫| 欧美丰满少妇xxxxx| 欧美成人三级视频网站| 91日韩在线播放| 亚洲欧美在线磁力| 亚洲人成伊人成综合网久久久| 色综久久综合桃花网| 91精品成人久久| 日本精品一区二区三区在线播放视频| 国产男女猛烈无遮挡91| 亚洲综合成人婷婷小说| 日韩精品高清在线观看| 亚洲精品国产美女| 97色伦亚洲国产| 久99久在线视频| 2019最新中文字幕| 国产久一一精品| 久久亚洲成人精品| 久久精品视频免费播放| 欧美国产亚洲视频| 欧美黑人国产人伦爽爽爽| 国产精品久久久久一区二区| 在线电影av不卡网址| 91豆花精品一区| 正在播放欧美一区| 亚洲老头老太hd| 亚洲伊人第一页| 亚洲欧洲日本专区| 国产精品嫩草视频| 亚洲综合大片69999| 九九视频直播综合网| 国产精品视频一区国模私拍| 欧美大片在线免费观看| 久久影视三级福利片| 亚洲男人天堂视频| 亚洲精选中文字幕| 日韩美女主播视频| 亚洲欧美激情在线视频| 亚洲性69xxxbbb| 久久青草精品视频免费观看| 欧美整片在线观看| 成人免费在线视频网址| 秋霞成人午夜鲁丝一区二区三区| 日韩欧美亚洲国产一区| 最新国产成人av网站网址麻豆| 欧美激情精品久久久久久大尺度| 国产精品国产自产拍高清av水多| 尤物99国产成人精品视频| 一区二区欧美在线| 欧美国产日韩一区二区| 91九色国产视频| 国产精品自产拍高潮在线观看| 456国产精品| 51精品国产黑色丝袜高跟鞋| 久久精品99久久久久久久久| 日韩亚洲一区二区| 日本成熟性欧美| 黄色精品一区二区| 96精品视频在线| 久久久久久久久中文字幕| 欧美国产日韩视频| 亚洲xxxx视频| 欧美日韩国产91| 亚洲影院在线看| 97视频在线观看亚洲| 在线播放日韩欧美| 国产精品视频免费观看www| 日本久久久久久久久久久| 国产精品99久久久久久人| 日韩av在线最新| 在线看日韩欧美| 亚洲天堂av电影|