在Mendix上我也是第一次用到XPath,但其實XPath早在1998年就已經存在了,最近的版本在2017年更新過,XPath是一種XML路徑語言(XML Path Language),主要用來確認XML檔案中某節點(node)的存在位置。跟我們平常在用的HTML一樣,XML也是一個樹狀結構,因此XPath可以依循著該結構來找尋需要的部分。
一般來說XPath主要有七種節點:element, attribute, text, namespace, processing instruction, comment, document,且有超過200種內建函數(function)。
時至今日,XPath使用範圍極廣,可用在JavaScript, Java, XML Schema, PHP, Python, C 與 C++等等程式語言,而XPath也是XSLT語言中重要的一環
以Kanye West的歌曲為例(嘿嘿!想不到我這樣都可以提到肯爺,我們可以寫出以下的XML檔案
<?xml version="1.0" encoding="UTF-8"?>
<album>
<song>
<title lang="en">Ni**as In Paris</title>
<singer>Jay-Z, Kanye West</singer>
<year>2011</year>
<genre>Hip Hop</genre>
</song>
</album>
以這個結構來說<album> </album>
是root element node
而<genre>Hip Hop</genre>
是一個 element nodelang="en"
是一個attribute node
節點之間的關係,跟我們熟悉的親戚樹狀圖有點像
想像你是<genre>Hip Hop</genre>
這一個節點,<song>
即是你的父節點(Parent),你是<song>
的子節點(Child),而其他<title>
<singer>
… 是你的同輩節點(Siblings)。
而Hip Hop 與 en 被稱為Atomic Values,因為在他們之下就沒有其他東西了。
使用於選擇節點的符號有
album: 選擇全部叫作album的節點
/album: 選擇叫album的root element node
album/song: 選擇album中全部叫作的song 子節點
//song: 選擇全部叫作song的節點,無論他們在哪一個位置上
album//song: 選擇album以下的所有叫做song的節點無論是在哪一層
//@lang: 選擇所有叫做lang的屬性(attribute)
其他更進階的節點選擇方式可以上w3schools上查看。
小孩才做選擇呢,我全都要用用看! 以下表單收錄會用到的操作符
以這個XML為例
<?xml version="1.0" encoding="UTF-8"?>
<albums>
<album>
<title lang="en">Watch the Throne</title>
<singer>Jay-Z, Kanye West</singer>
<year>2011</year>
<genre>Hip Hop</genre>
</album>
<album>
<title lang="en">My Beautiful Dark Twisted Fantasy</title>
<singer> Kanye West</singer>
<year>2010</year>
<genre>Hip Hop</genre>
</album>
</albums>
找所有專輯的標題
/albums/album/title
找第一個專輯的標題 (注意是從1開始算!)
/albums/album[1]/title
找所有2010年以後的專輯標題
/albums/album[year>2010]/title
找所有專輯的演唱者
/albums/album/singer[text()]
結論, XPath在Mendix上很常被用到,這次認真研究後才發現,原來還有更多以前不知道的操作方式!!