天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

XPath詳解,總結(jié)

   經(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標準的確立是在2007年。W3C關(guān)于XPath的英文詳細文檔請見:http://www.w3.org/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)于在XSLT和XQuery中使用XPath表達式定位節(jié)點的知識在后面的實例中會有所介紹。

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

   XPath路徑表達式

   在本小節(jié)下面的內(nèi)容中你將可以學習到:

  • 路徑表達式語法
  • 相對/絕對路徑
  • 表達式上下文
  • 謂詞(篩選表達式)及軸的概念
  • 運算符及特殊字符
  • 常用表達式實例
  • 函數(shù)及說明

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

   1.路徑表達式語法:

  1. 路徑 = 相對路徑 | 絕對路徑
  2. XPath路徑表達式 = 步進表達式 | 相對路徑 "/"步進表達式。
  3. 步進表達式=軸 節(jié)點測試 謂詞

   說明:

  1. 其中軸表示步進表達式選擇的節(jié)點和當前上下文節(jié)點間的樹狀關(guān)系(層次關(guān)系),節(jié)點測試指定步進表達式選擇的節(jié)點名稱擴展名,謂詞即相當于過濾表達式以進一步過濾細化節(jié)點集。
  2. 謂詞可以是0個或多個。多個多個謂詞用邏輯操作符and, or連接。取邏輯非用not()函數(shù)。

   請看一個典型的XPath查詢表達式:/messages/message//child::node()[@id=0],其中/messages/message是路徑(絕對路徑以"/"開始),child::是軸表示在子節(jié)點下選擇,node()是節(jié)點測試表示選擇所有的節(jié)點。[@id=0]是謂詞,表示選擇所有有屬性id并且值為0的節(jié)點。

   2.相對路徑與絕對路徑:

   如果"/"處在XPath表達式開頭則表示文檔根元素,(表達式中間作為分隔符用以分割每一個步進表達式)如:/messages/message/subject是一種絕對路徑表示法,它表明是從文檔根開始查找節(jié)點。假設(shè)當前節(jié)點是在第一個message節(jié)點【/messages/message[1]】,則路徑表達式subject(路徑前沒有"/")這種表示法稱為相對路徑,表明從當前節(jié)點開始查找。具體請見下面所述的"表達式上下文"。

   3.表達式上下文(Context):

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

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

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

  • 父節(jié)點(../):

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

  • 根元素(/):

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

  • 根節(jié)點(/*):

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

  • 遞歸下降(//):

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

    /messages//sender :

    <sender>[email protected]</sender>

    <sender>[email protected]</sender>

    <sender>[email protected]</sender>

    /messages/message[1]//sender:

    <sender>[email protected]</sender>

    <sender>[email protected]</sender>

    我們可以看出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)境。更多信息請參見:http://www.w3.org/TR/xpath20/

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

   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é)點

parent

選取當前節(jié)點的父節(jié)點。

preceding

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

preceding-sibling

選取當前節(jié)點之前的所有同級節(jié)點。

self

選取當前節(jié)點。

  5.運算符及特殊字符:

運算符/特殊字符

說明

/

此路徑運算符出現(xiàn)在模式開頭時,表示應(yīng)從根節(jié)點選擇。

//

從當前節(jié)點開始遞歸下降,此路徑運算符出現(xiàn)在模式開頭時,表示應(yīng)從根節(jié)點遞歸下降。

.

當前上下文。

..

當前上下文節(jié)點父級。

*

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

@

屬性名的前綴。

@*

選擇所有屬性,與名稱無關(guān)。

:

命名空間分隔符;將命名空間前綴與元素名或?qū)傩悦指簟?/span>

( )

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

[ ]

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

[ ]

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

|

兩個節(jié)點集合的聯(lián)合,如://messages/message/to | //messages/message/cc

-

減法。

div,

浮點除法。

and, or

邏輯運算。

mod

求余。

not()

邏輯非

=

等于

!=

不等于

特殊比較運算符

< 或者 <

<= 或者 <=

> 或者 >

>= 或者 >=

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

6.常用表達式實例:

/

Document Root文檔根.

/*

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

/node()

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

/text()

查找文檔根節(jié)點下的所有文本節(jié)點

/messages/message

messages節(jié)點下的所有message節(jié)點

/messages/message[1]

messages節(jié)點下的第一個message節(jié)點

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

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

/messages/message[1]/node()

第一個message節(jié)點下的所有子節(jié)點

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

第一個message節(jié)點的最后一個子節(jié)點

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

Error,謂詞前必須是節(jié)點或節(jié)點集

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

第一個message節(jié)點的最后一個子節(jié)點

/messages/message[1]/text()

第一個message節(jié)點的所有子節(jié)點

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

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

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

/messages/message[1] /node()

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

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

第一個message節(jié)點下的所有子節(jié)點

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

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

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

選擇id=1的message節(jié)點以及id=0的message節(jié)點

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

Messages節(jié)點

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

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

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

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

//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節(jié)點的所有節(jié)點

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

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

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

查找id=1的message節(jié)點的sender節(jié)點的所有后續(xù)的同級節(jié)點。

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

查找id=1的message節(jié)點的datetime節(jié)點的date屬性

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

//message/datetime[attribute::date]

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

//message[datetime]

查找所有含有datetime節(jié)點的message節(jié)點

//message/datetime/attribute::*

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

//message/datetime/@*

返回message節(jié)點下datetime節(jié)點的所有屬性節(jié)點

//message/datetime[attribute::*]

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

//message/datetime[@*]

//message/datetime[@node()]

選擇所有含有屬性的datetime節(jié)點

//attribute::*

選擇根節(jié)點下的所有屬性節(jié)點

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

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

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

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

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

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

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

//namespace::*

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

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

選擇books下的所有的book節(jié)點,

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

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

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

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

選擇year節(jié)點值>2006的book節(jié)點

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

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

返回xs:boolean: true

  7.函數(shù)及說明:

   值得欣喜的是XPath函數(shù)和XSLT,XQuery等共享函數(shù)庫,函數(shù)庫為我們提供了功能豐富的各種函數(shù)的調(diào)用,我們也可以自定義自己的函數(shù)。這里不再對每個函數(shù)的用法逐一說明,英文好點的朋友直接去看看w3關(guān)于XPath函數(shù)的介紹吧:http://www.w3.org/TR/xquery-operators 。中文的可以參考這個網(wǎng)站, http://www.w3school.com.cn/xpath/xpath_functions.ASP

   XPath在DOM,XSLT及XQuery中的應(yīng)用

   DOM:

  

Code
<!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>

NET技術(shù)XPath詳解,總結(jié),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲综合香蕉在线视频 | 国产色婷婷精品人妻蜜桃成熟 | 欧美91精品久久久久网免费 | 免费精品国产人妻国语 | 国产精品九九九久久九九 | 亚洲 色 欧美 爱 视频 日韩 | 碰超成人在线公开免费视频 | 亚洲精品久久一区二区三区四区 | 欧美性情video sexo视频 | 97人妻碰视频在线观看 | 天堂视频在线观看免费完整版 | 精品AV亚洲乱码一区二区 | 色多多旧版污污破解版 | 又紧又大又爽精品一区二区 | 日日夜夜操操操 | 久久久久久久久女黄9999 | 精品欧美18videosex欧美 | 国产精品一区二区三区免费 | 高清国产mv视频在线观看 | 无遮挡h肉3d动漫在线观看 | 波多野结衣教师系列6 | avtt天堂网Av无码 | 俄罗斯爱爱 | 三级叫床震大尺度视频 | 精品久久久久久无码人妻国产馆 | 天堂精品国产自在自线 | 成人在无码AV在线观看一 | 欧美精品久久久久性色AV苍井 | 国产人成高清在线视频99 | 34g污奶绵uk甩奶 | 沦为公交两奶头春药高潮迭起 | 国产色婷婷精品人妻蜜桃成熟时 | 最近免费中文字幕大全免费 | 国产一区2区 | 草民电影网午夜伦理电影网 | 日日干日日操日日射 | 视频区 国产 欧美 日韩 | 欧美最猛黑人AAAAA片 | 一个人看的HD免费高清视频 | 国产精品黄色大片 | 最近2018年手机中文字幕 |