3. XPath

  • Xpath Tree
  • Node
  • Location Path: Axes, Node Test

1.Xpath Tree

  • XML Path Language


  • 定義者:W3C


  • 功用:可以用來篩選XML上的Node以及作運算


  • 文法:與XPointer and XSLT相似


歷史:
XPath1.0從1999年代就開始了 當時除了自己獨立使用還有鑲嵌在XSLT 或 XForms的語言內
XPath2.0則在2007年出現 最大的不同點是多了Atomic type 讓每個value現在是一個sequence有可能是單一個atomic value或長度為一的Node

2.Node

  • 是在Tree上面的結構,用來對應xml文件中的每個node


  • Root : 對應xml文件中的根,一定是在樹的最上層


  • Element : 是一種前置標記,對應xml元素


  • Attribute : 對應xml元素屬性


  • Text : 對應xml元素內容


  • Comment : 對應xml註解


  • Processing instruction : 對應xml處裡指示,可用deitelprocessor 來處理指示節點後的字串


  • Namespace : 用來對應xml的Namespace,常用URI連結(因為每個URI是獨立的可做區分),用來防止命名碰撞

3.

  • Location Path: Axes, Node Test
  • Location Path是讓系統知道怎麼在XPath Tree上的節點之間搜尋的表達式
  • 基本上由Axes,Node Testm與選擇性的Predicates所組成

4.Axes - 用表示Node順序,分為兩種 :

  •  正向:挑選的順序是在內容節點之後的Axe稱之
  • 反向:挑選的順序是在內容節點之前的Axe稱之

      對不同的Axes首要節點的優先順序

  • 對attribute Axes:attribute
  • 對namespace Axes:namespace
  • 其他:element

Node Test : 假如Axes選取Tree上的部份Node, Node Test就會根據首要節點的優先順序重新做出一個集合

重點:

  • 表達式裡面的屬性前面要加 @
  • attribute Node和namespace Node 是用來描述他們的parent
  • location path 是由連續的location steps 組成的
  • 只有Element, Comment, Text, Processing instruction的Node可以當子節點

5.XPath也有不少函式可以用來處理不同的資料類別,像是數字,字串之類的。

        XPath也有定義路徑符號,用來指出文件中的特定節點集,就像是檔案系統。

        但一般的檔案路徑跟XPath的路徑還是有點不同,因為XPath所指定的路徑是節點集而並不是單一的節點。

        但如果XPath是選到單一個節點,則表示在那個節點集裡只有被選到的那個單一節點。

        而若是XPath沒有選擇到任何節點,則表示那是一個空的節點集。

        當使用XPath時可以避免XML文件結構的改變或是節點選擇邏輯的改變所產生的問題。

 

Xpath : XML path language
  • 一種用來 define/查詢 XML文檔中某部分位置的語言
  • 很快的被開發者採用來當作小型查詢語言

舉W3school例子 :
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>
  <book>
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

  • root element node : <bookstore>
  • element node : <author>J K. Rowling</author>
  • attribute node : lang="en"
  • Atomic value : Atomic values are nodes with no children or parent.
    • Example of atomic values: J K. Rowling
    • "en"
  • Items : Items are atomic values or nodes.

每個Node之間的關係

  • parent : Each element and attribute has one parent.
    • 在上面的例子<book>是<title>,<author>,<year>,<price>的parent
    • <bookstore>是<book>的parent
  • child  : Element nodes may have zero, one or more children.
    • <title>,<author>,<year>,<price>是<book>的child
  • sibling  : Nodes that have the same parent.
    • <title>,<author>,<year>,<price>都是算同一階層,所以他們互為sibling
  • ancestor  : A node's parent, parent's parent, etc.
    • <book>,<bookstore>都是<title>,<author>,<year>,<price>的ancestor
  • descendant  : A node's children, children's children, etc.
    • <bookstore>的descendants有<book>,<title>,<author>,<year>,<price>

語法介紹

  • node的名子 : 選出該node的所有childen
  • / : 選root node
  • // : 無視階層關係,只要符合條件就選,無論該node在哪
  • . : 目前的node
  • .. : 目前node的parent
  • @ : 選擇屬性

舉例子來說明上面的東西 :
<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

  • bookstore : 選bookstore所有的children
  • /bookstore : 選bookstore而已
  • bookstore/book : 找出parent是bookstore的book
  • //book : 找出所有book node無論在哪
  • bookstore//book : 找出所有book,其parent或是parent的parent(ancestor)為bookstore
  • //@lang : 所出所有attribute,該名稱為lang

Predicates

  • /bookstore/book[1] : 選擇第1個parent是bookstore的book的元素
  • //title[@lang='eng'] : 選擇所有attribute lang = 'eng'的title元素
  • //title[@lang] : 選擇attribute名稱是lang的所有title元素
  • /bookstore/book[price>35.00]/title : Selects all the title elements of the book elements of the bookstore element that have a price element with a value greater than 35.00

可以用執行多個node test 的 operation : |
例如 : //book/title | //book/price : 選擇所有parent是book的title跟price

* : 代表全部
@* : 所有的attribute node
node() : any node of any kind

Xpath Axes

  • ancestor : 選擇目前這個node的所有的祖先(parent,parent's parent... etc.)
  • ancestor-or-self : 選擇目前這個node的所有的祖先和自己本身
  • attribute : 選擇目前這個node的所有attribute
  • child : 選擇目前這個node的所有children
  • descendant : 選擇目前這個node的後代(children,children's children...etc)
  • descendant-or-self : 選擇目前這個node的後代和自己本身
  • following : 選擇目前在文件中這個node底下的所有東西
  • following-sibling : 選擇目前在文件中這個node底下的所有sibling
  • namespace : 選擇目前這個node的所有namespace node
  • parent : 選擇目前這個node的parent
  • preceding : 選擇目前這個node上面的所有東西
  • preceding-sibling : 選擇目前這個node上面的所有sibling
  • self : 選擇目前這個node

路徑表示法

  1. 絕對路徑 : /step/step/...
  2. 相對路徑 : step/step/...
  3. step的語法 : axisname::nodetest[predicate]

Xpath Operators

Operator 描述 例子 回傳值
| Computes two node-sets //book | //cd Returns a node-set with all book and cd elements
+ 做加法   1+ 2 3
- 做減法   4- 2 2
* 做乘法

  8 * 3

24
div 做除法   16 div 8 2
= 是否相等 price=9.80 true if price is 9.80
false if price is 9.90
!= 是否不同 price!=9.80 true if price is 9.90
false if price is 9.80
< 是否小於 price<9.80 true if price is 9.00
false if price is 9.80
<= 是否小於等於 price<=9.80 true if price is 9.00
false if price is 9.90
> 是否大於 price>9.80 true if price is 9.90
false if price is 9.80
>= 是否大於等於 price>=9.80 true if price is 9.90
false if price is 9.70
or or price=9.80 or price=9.70 true if price is 9.80
false if price is 9.50
and and price>9.00 and price<9.90 true if price is 9.80
false if price is 8.50
mod 取餘數 5 mod 2 1