2009年4月28日

XPath詳解

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"?>
<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>
                
    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查詢運算式:/messages/message//child::node()[@id=0],其中/messages/message是路徑(絕對路徑以"/"開始),child::是表示在子節點下選擇,node()是節點測試表示選擇所有的節點。[@id=0]表示選擇所有有屬性id並且值為0的節點。

相對路徑與絕對路徑:
如果"/"在XPath運算式開頭則表示為根節點,(運算式中間作為分隔符號用以分割每一個層級)如:/messages/message/subject是一種絕對路徑表示法,它表明是從根開始查詢節點。假設目前節點是在第一個message節,如:/messages/message[1],則路徑為subject(路徑前沒有"/")這種表示法稱為相對路徑,表明從目前節點開始查詢。

XPath位置路徑運算子:

運算子
範例
說明
./
./sender表示選擇目前節點下的sender節點集合
../
../sender表示選擇目前節點的父節點下的sender節點集合
/
/messages表示選擇從根節點下的messages節點集合
*
/*這裏的*是代表所有節點,/*的結果和/messages的結果一樣都是messages節點
 /*/*/sender表示所有位於第三層的sender
//
/messages//sender <sender>gkt1980@gmail.com</sender>
<sender>111@gmail.com</sender>
<sender>333@gmail.com</sender>
從目前節點開始遞迴搜索其下的所有子節點找到滿足條件的節點集合