##XPATH介紹
<div>
<div>
<p><strong></strong></p></div></div><p><span>XPath簡介</span> </p>
<p>XPath是W3C的一個標準。它最主要的目的是為了在XML1.0或XML1.1文檔節點樹中定位節點所設計。目前有XPath1.0和 XPath2.0兩個版本。其中Xpath1.0是1999年成為W3C標準,而XPath2.0標準的確立是在2007年。W3C關于XPath的英文 詳細文檔請見:<span><span>http://www.w3.org/TR/xpath20/</span></span> 。 </p>
<p>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表達式定位節點的知識在后面的實例中會有所介紹。 </p>
<p>在學習XPath之前你應該對XML的節點,元素,屬性,原子值(文本),處理指令,注釋,根節點(文檔節點),命名空間以及對節點間的關系如:父 (Parent),子(Children),兄弟(Sibling),先輩(Ancestor),后代(Descendant)等概念有所了解。這里不在 說明。 </p>
<p><span>XPath路徑表達式</span> </p>
<p>在本小節下面的內容中你將可以學習到: </p>
<div>
<div> - 路徑表達式語法</div>
<div> - 相對/絕對路徑</div>
<div> - 表達式上下文</div>
<div> - 謂詞(篩選表達式)及軸的概念</div>
<div> - 運算符及特殊字符</div>
<div> - 常用表達式實例</div>
<div> - 函數及說明 </div>
</div>
<p>這里給出一個實例Xml文件。下面的說明及實例都是基于該XML文件。 </p>
<p><span>路徑表達式語法:</span> </p>
<div>
<div> 1. 路徑 = 相對路徑 | 絕對路徑</div>
<div> 2. XPath路徑表達式 = 步進表達式 | 相對路徑 "/"步進表達式。</div>
<div> 3. 步進表達式=軸 節點測試 謂詞 </div>
</div>
<p>說明: </p>
<div>
<div> 1. 其中軸表示步進表達式選擇的節點和當前上下文節點間的樹狀關系(層次關系),節點測試指定步進表達式選擇的節點名稱擴展名,謂詞即相當于過濾表達式以進一步過濾細化節點集。</div>
<div> 2. 謂詞可以是0個或多個。多個多個謂詞用邏輯操作符and, or連接。取邏輯非用not()函數。 </div>
</div>
<div>
請看一個典型的XPath查詢表達式:/messages/message//child::node()[@id=0],其中 /messages/message是路徑(絕對路徑以"/"開始),child::是軸表示在子節點下選擇,node()是節點測試表示選擇所有的節 點。[@id=0]是謂詞,表示選擇所有有屬性id并且值為0的節點。
</div>
<div>
</div>
<div>
<span>相對路徑與絕對路徑:</span>
</div>
<div>
如果"/"處在XPath表達式開頭則表示文檔根元素,(表達式中間作為分隔符用以分割每一個步進表達式)如:/messages /message/subject是一種絕對路徑表示法,它表明是從文檔根開始查找節點。假設當前節點是在第一個message節點【/messages /message[1]】,則路徑表達式subject(路徑前沒有"/")這種表示法稱為相對路徑,表明從當前節點開始查找。具體請見下面所述的"表達 式上下文"。
</div>
<div>
<span>表達式上下文(Context):</span>
</div>
<div>
上下文其實表示一種環境。以明確當前XPath路徑表達式處在什么樣的環境下執行。例如同樣一個路徑表達式處在對根節點操作的環境和處在對某一個特定子節點操作的環境下執行所獲得的結果可能是完全不一樣的。也就是說XPath路徑表達式計算結果取決于它所處的上下文。
</div>
<div>
<span>XPath上下文基本有以下幾種</span>:
</div>
<div>
<div> -
<div>
當前節點(./):
<br>如./sender表示選擇當前節點下的sender節點集合(等同于下面所講的"特定元素",如:sender)
</div></div>
<div> -
<div>
父節點(../):
<br>如../sender表示選擇當前節點的父節點下的sender節點集合
</div></div>
<div> -
<div>
根元素(/):
<br>如/messages表示選擇從文檔根節點下的messages節點集合.
</div></div>
<div> -
<div>
根節點(/*):
<br>這里的*是代表所有節點,但是根元素只有一個,所以這里表示根節點。/*的返回結果和/messages返回的結果一樣都是messages節點。
</div></div>
<div> -
<div>
遞歸下降(//):
<br>如當前上下文是messages節點。則//sender將返回以下結果:
<br>/messages//sender :
<br><sender>gkt1980@gmail.com</sender>
<br><sender>111@gmail.com</sender>
<br><sender>333@gmail.com</sender>
<br>
<br>/messages/message[1]//sender:
<br><sender>gkt1980@gmail.com</sender>
<br><sender>111@gmail.com</sender>
<br>
<br>我們可以看出XPath表達式返回的結果是:從當前節點開始遞歸步進搜索當前節點下的所有子節點找到滿足條件的節點集。
</div></div>
<div> -
<div>
特定元素
<br>如sender:表示選擇當前節點下的sender節點集合,等同于(./sender)
</div></div>
</div>
<div>
注意:在執行XPath時一定要注意上下文。即當前是在哪個節點下執行XPath表達式。這在XMLDOM中很重要。如:在XMLDOM中的 selectNodes,selectSingleNode方法的參數都是一個XPath表達式,此時這個XPath表達式的執行上下文就是調用這個方法 的節點及它所在的環境。更多信息請參見:
<span><span>http://www.w3.org/TR/xpath20/</span></span>
</div>
<div>
<span>謂詞(篩選表達式)及軸的概念</span>:
</div>
<div>
XPath的謂詞即篩選表達式,類似于SQL的where子句.
</div>
<p> </p>
<div>
</div><table border="1" cellpadding="2" cellspacing="0">
<tbody>
<tr>
<td>
<div>
<span><span>軸名稱</span></span>
</div></td>
<td>
<div>
<span><span>結果</span></span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>ancestor</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有先輩(父、祖父等)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>ancestor-or-self</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有先輩(父、祖父等)以及當前節點本身</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>attribute</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有屬性</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>child</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有子元素。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>descendant</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有后代元素(子、孫等)。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>descendant-or-self</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有后代元素(子、孫等)以及當前節點本身。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>following</span>
</div></td>
<td>
<div>
<span>選取文檔中當前節點的結束標簽之后的所有節點。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>namespace</span>
</div></td>
<td>
<div>
<span>選取當前節點的所有命名空間節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>parent</span>
</div></td>
<td>
<div>
<span>選取當前節點的父節點。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>preceding</span>
</div></td>
<td>
<div>
<span>直到所有這個節點的父輩節點,順序選擇每個父輩節點前的所有同級節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>preceding-sibling</span>
</div></td>
<td>
<div>
<span>選取當前節點之前的所有同級節點。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>self</span>
</div></td>
<td>
<div>
<span>選取當前節點。</span>
</div></td>
</tr>
</tbody>
</table>
<div>
運算符及特殊字符:
</div>
<p> </p>
<table border="1" cellpadding="2" cellspacing="0">
<tbody>
<tr>
<td>
<div>
<span><span>運算符/特殊字符</span></span>
</div></td>
<td>
<div>
<span><span>說明</span></span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/ </span>
</div></td>
<td>
<div>
<span>此路徑運算符出現在模式開頭時,表示應從根節點選擇。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>// </span>
</div></td>
<td>
<div>
<span>從當前節點開始遞歸下降,此路徑運算符出現在模式開頭時,表示應從根節點遞歸下降。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>. </span>
</div></td>
<td>
<div>
<span>當前上下文。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>.. </span>
</div></td>
<td>
<div>
<span>當前上下文節點父級。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>* </span>
</div></td>
<td>
<div>
<span>通配符;選擇所有元素節點與元素名無關。(不包括文本,注釋,指令等節點,如果也要包含這些節點請用node()函數)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>@ </span>
</div></td>
<td>
<div>
<span>屬性名的前綴。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>@* </span>
</div></td>
<td>
<div>
<span>選擇所有屬性,與名稱無關。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>: </span>
</div></td>
<td>
<div>
<span>命名空間分隔符;將命名空間前綴與元素名或屬性名分隔。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>( ) </span>
</div></td>
<td>
<div>
<span>括號運算符(優先級最高),強制運算優先級。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>[ ] </span>
</div></td>
<td>
<div>
<span>應用篩選模式(即謂詞,包括"過濾表達式"和"軸(向前/向后)")。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>[ ] </span>
</div></td>
<td>
<div>
<span>下標運算符;用于在集合中編制索引。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>| </span>
</div></td>
<td>
<div>
<span>兩個節點集合的聯合,如://messages/message/to | //messages/message/cc</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>- </span>
</div></td>
<td>
<div>
<span>減法。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>div,</span>
</div></td>
<td>
<div>
<span>浮點除法。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>and, or </span>
</div></td>
<td>
<div>
<span>邏輯運算。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>mod </span>
</div></td>
<td>
<div>
<span>求余。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>not()</span>
</div></td>
<td>
<div>
<span>邏輯非</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>=</span>
</div></td>
<td>
<div>
<span>等于</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>!=</span>
</div></td>
<td>
<div>
<span>不等于</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>特殊比較運算符</span>
</div></td>
<td>
<div>
<span>< 或者 &lt; </span>
</div>
<div>
<span><= 或者 &lt;= </span>
</div>
<div>
<span>> 或者 &gt; </span>
</div>
<div>
<span>>= 或者 &gt;= </span>
</div>
<div>
<span>需要轉義的時候必須使用轉義的形式,如在XSLT中,而在XMLDOM的scripting中不需要轉義。</span>
</div></td>
</tr>
</tbody>
</table>
<div>
常用表達式實例:
</div>
<p> </p>
<table border="1" cellpadding="2" cellspacing="0">
<tbody>
<tr>
<td>
<div>
<span>/</span>
</div></td>
<td>
<div>
<span>Document Root文檔根.</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/*</span>
</div></td>
<td>
<div>
<span>選擇文檔根下面的所有元素節點,即根節點(XML文檔只有一個根節點)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/node()</span>
</div></td>
<td>
<div>
<span>根元素下所有的節點(包括文本節點,注釋節點等)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/text()</span>
</div></td>
<td>
<div>
<span>查找文檔根節點下的所有文本節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message</span>
</div></td>
<td>
<div>
<span>messages節點下的所有message節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]</span>
</div></td>
<td>
<div>
<span>messages節點下的第一個message節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/self::node()</span>
</div></td>
<td>
<div>
<span>第一個message節點(self軸表示自身,node()表示選擇所有節點)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/node()</span>
</div></td>
<td>
<div>
<span>第一個message節點下的所有子節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/*[last()]</span>
</div></td>
<td>
<div>
<span>第一個message節點的最后一個子節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/[last()]</span>
</div></td>
<td>
<div>
<span>Error,謂詞前必須是節點或節點集</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/node()[last()]</span>
</div></td>
<td>
<div>
<span>第一個message節點的最后一個子節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/text()</span>
</div></td>
<td>
<div>
<span>第一個message節點的所有子節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]//text()</span>
</div></td>
<td>
<div>
<span>第一個message節點下遞歸下降查找所有的文本節點(無限深度)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1] /child::node() </span>
</div>
<div>
<span>/messages/message[1] /node() </span>
</div>
<div>
<span>/messages/message[position()=1]/node() </span>
</div>
<div>
<span>//message[@id=1] /node()</span>
</div></td>
<td>
<div>
<span>第一個message節點下的所有子節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=1] //child::node()</span>
</div></td>
<td>
<div>
<span>遞歸所有子節點(無限深度)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[position()=1]/node()</span>
</div></td>
<td>
<div>
<span>選擇id=1的message節點以及id=0的message節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1] /parent::*</span>
</div></td>
<td>
<div>
<span>Messages節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/body/attachments/parent::node() </span>
</div>
<div>
<span>/messages/message[1]/body/attachments/parent::* /messages/message[1]/body/attachments/..</span>
</div></td>
<td>
<div>
<span>attachments節點的父節點。父節點只有一個,所以node()和* 返回結果一樣。 </span>
</div>
<div>
<span>(..也表示父節點. 表示自身節點)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]/ancestor::*</span>
</div></td>
<td>
<div>
<span>Ancestor軸表示所有的祖輩,父,祖父等。 </span>
</div>
<div>
<span>向上遞歸</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]/ancestor-or-self::*</span>
</div></td>
<td>
<div>
<span>向上遞歸,包含自身</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]/ancestor::node()</span>
</div></td>
<td>
<div>
<span>對比使用*,多一個文檔根元素(Document root)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/descendant::node() </span>
</div>
<div>
<span>//messages/message[1]//node()</span>
</div></td>
<td>
<div>
<span>遞歸下降查找message節點的所有節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>/messages/message[1]/sender/following::*</span>
</div></td>
<td>
<div>
<span>查找第一個message節點的sender節點后的所有同級節點,并對每一個同級節點遞歸向下查找。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=1]/sender/following-sibling::*</span>
</div></td>
<td>
<div>
<span>查找id=1的message節點的sender節點的所有后續的同級節點。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=1]/datetime/@date</span>
</div></td>
<td>
<div>
<span>查找id=1的message節點的datetime節點的date屬性</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=1]/datetime[@date] </span>
</div>
<div>
<span>//message/datetime[attribute::date]</span>
</div></td>
<td>
<div>
<span>查找id=1的message節點的所有含有date屬性的datetime節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[datetime]</span>
</div></td>
<td>
<div>
<span>查找所有含有datetime節點的message節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message/datetime/attribute::* </span>
</div>
<div>
<span>//message/datetime/attribute::node() </span>
</div>
<div>
<span>//message/datetime/@*</span>
</div></td>
<td>
<div>
<span>返回message節點下datetime節點的所有屬性節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message/datetime[attribute::*] </span>
</div>
<div>
<span>//message/datetime[attribute::node()] </span>
</div>
<div>
<span>//message/datetime[@*] </span>
</div>
<div>
<span>//message/datetime[@node()]</span>
</div></td>
<td>
<div>
<span>選擇所有含有屬性的datetime節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//attribute::*</span>
</div></td>
<td>
<div>
<span>選擇根節點下的所有屬性節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]/body/preceding::node()</span>
</div></td>
<td>
<div>
<span>順序選擇body節點所在節點前的所有同級節點。(查找順序為:先找到body節點的頂級節點(根節點),得到根節點標簽前的所有同級節點,執行完成后繼續向下一級,順序得到該節點標簽前的所有同級節點,依次類推。) </span>
</div>
<div>
<span>注意:查找同級節點是順序查找,而不是遞歸查找。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]/body/preceding-sibling::node()</span>
</div></td>
<td>
<div>
<span>順序查找body標簽前的所有同級節點。(和上例一個最大的區別是:不從最頂層開始到body節點逐層查找。我們可以理解成少了一個循環,而只查找當前節點前的同級節點)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=1]//*[namespace::amazon]</span>
</div></td>
<td>
<div>
<span>查找id=1的所有message節點下的所有命名空間為amazon的節點。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//namespace::*</span>
</div></td>
<td>
<div>
<span>文檔中的所有的命名空間節點。(包括默認命名空間xmlns:xml)</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]//books/*[local-name()='book']</span>
</div></td>
<td>
<div>
<span>選擇books下的所有的book節點, </span>
</div>
<div>
<span>注意:由于book節點定義了命名空間<amazone:book>.若寫成//message[@id=0]//books/book則查找不出任何節點。</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]//books/*[local-name()='book' and namespace-uri()='http://www.amazon.com/books/schema']</span>
</div></td>
<td>
<div>
<span>選擇books下的所有的book節點,(節點名和命名空間都匹配) </span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]//books/*[local-name()='book'][year>2006]</span>
</div></td>
<td>
<div>
<span>選擇year節點值>2006的book節點</span>
</div></td>
</tr>
<tr>
<td>
<div>
<span>//message[@id=0]//books/*[local-name()='book'][1]/year>2006</span>
</div></td>
<td style="width:340px;height:18px;">
<div>
<span>指示第一個book節點的year節點值是否大于2006. </span>
</div>
<div>
<span>返回xs:boolean: true</span>
</div></td>
</tr>
</tbody>
</table>
<div>
<span>函數及說明</span>:
</div>
<div>
值得欣喜的是XPath函數和XSLT,XQuery等共享函數庫,函數庫為我們提供了功能豐富的各種函數的調用,我們也可以自定義自己的函數。這里不再對每個函數的用法逐一說明,英文好點的朋友直接去看看w3關于XPath函數的介紹吧:
<span><span>http://www.w3.org/TR/xquery-operators</span></span> 。中文的可以參考這個網站,
<span><span>http://www.w3school.com.cn/xpath/xpath_functions.asp</span></span>
</div>
<div>
</div>
<div>
<span>XPath在DOM,XSLT及XQuery中的應用</span>
</div>
<p> </p>
<p> </p>
<div>
<div>
<img data-media-type="image" src="http://note.youdao.com/yws/res/10694/840476CE055E41FB9DB46FB107CBC9CD" alt="復制代碼" />
</div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<br><html xmlns="http://www.w3.org/1999/xhtml">
<br><head>
<br><title>XPath Test</title>
<br></head>
<br><body>
<br>
<br><script language="javascript" type="text/javascript">
<br>
<span>var</span> xmlDoc =
<span>new</span> ActiveXObject("Microsoft.XMLDOM");
<br>xmlDoc.async="false";
<br>xmlDoc.load("messages.xml");
<br>xmlDoc.setProperty("SelectionLanguage", "XPath");
<br>
<span>var</span> sPath = "/messages/message[1]//books/*[local-name()='book']";
<br>
<span>var</span> bookNodes = xmlDoc.selectNodes(sPath);
<br>
<br>document.write("<ul>");
<br>
<span>for</span> (
<span>var</span> i = 0; i < bookNodes.length; i++) {
<br>document.write("<li>" + bookNodes[i].childNodes[0].text + "</li>");
<br>}
<br>document.write("</ul>");
<br></script>
<br>
<br></body>
<br></html>
<br>
<div>
<img data-media-type="image" src="http://note.youdao.com/yws/res/10694/840476CE055E41FB9DB46FB107CBC9CD" alt="復制代碼" />
</div>
</div>
<p> </p>
<div>
<span>注意</span>:
</div>
<div>
我們若使用new ActiveXObject("Microsoft.XMLDOM")則需要注意的是:因為早期的XMLDOM的SelectionLanguage屬性 默認是正則表達式,不是XPath語言。所以需要指定這樣一條語句xmlDoc.setProperty("SelectionLanguage", "XPath"); 以支持XPath查詢表達式。.
</div>
<div>
若沒有指定SelectionLanguage屬性值為XPath則要注意以下情況:
</div>
<div>
<div> 1.
<div>
數組下標從0開始(我們知道在XPath查詢表達式中數組下標是從1開始的)
</div></div>
<div> 2.
<div>
不支持在XPath查詢表達式中使用XPath函數。
</div></div>
</div>
<div>
<span>XSLT</span>:
<br>見:我的另外一篇關于如何使用XSLT的一個小示范
<span><span>http://www.cnblogs.com/ktgu/archive/2008/12/14/1354890.html</span></span>
</div>
<div>
<span>XQuery</span>:
<br>
</div>
<p> </p>
<div>
<div>
<img data-media-type="image" src="http://note.youdao.com/yws/res/10694/840476CE055E41FB9DB46FB107CBC9CD" alt="復制代碼" />
</div>xquery version "1.0";
<br>
<br><ul>
<br>{
<br>let $i := 0
<br>
<span>for</span> $x in doc("C:\Users\Administrator\Desktop\messages.xml")
<span>//</span>
<span>message[@id=0]</span>
<span>//</span>
<span>books/*[local-name()='book'] </span>
<span><br></span>where $x/year>2006
<br>order by $x/year descending
<br>
<span>return</span> <li>{ data($x/name) } </li>
<br>}
<br></ul>
<br>
<div>
<img data-media-type="image" src="http://note.youdao.com/yws/res/10694/840476CE055E41FB9DB46FB107CBC9CD" alt="復制代碼" />
</div>
</div>
<p> </p>
<div>返回結果</div>
<div>
<div dir="ltr">
<ul>
<br> <li>Microsoft Visual C# 2008 Step by Step </li>
<br> <li>Professional C# 2008 </li>
<br></ul></div></div><div><div><div><div dir="ltr">
</div>
</div>
</div>
</div>
- Introduction
- 爬蟲相關技能介紹
- 爬蟲簡單介紹
- 爬蟲涉及到的知識點
- 爬蟲用途
- 爬蟲流程介紹
- 需求描述
- Http請求處理
- http基礎知識介紹
- http狀態碼
- httpheader
- java原生態處理http
- URL類
- 獲取URL請求狀態
- 模擬Http請求
- apache httpclient
- Httpclient1
- httpclient2
- httpclient3
- httpclient4
- httpclient5
- httpclient6
- okhttp
- OKhttp使用教程
- 技術使用
- java執行javascript
- 網頁解析
- Xpath介紹
- HtmlCleaner
- HtmlCleaner介紹
- HtmlCleaner使用
- HtmlParser
- HtmlParser介紹
- Jsoup
- 解析和遍歷一個HTML文檔
- 解析一個HTML字符串
- 解析一個body片斷
- 從一個URL加載一個Document
- 從一個文件加載一個文檔
- 使用DOM方法來遍歷一個文檔
- 使用選擇器語法來查找元素
- 從元素抽取屬性,文本和HTML
- 處理URLs
- 示例程序 獲取所有鏈接
- 設置屬性的值
- 設置一個元素的HTML內容
- 消除不受信任的HTML (來防止XSS攻擊)
- 正則表達式
- elasticsearch筆記
- 下載安裝elasticsearch
- 檢查es服務健康