XPath可以快速定位到Xml中的節點或者屬性。XPath語法很簡單,但是強大夠用,它也是使用xslt的基礎知識。
示例Xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?
xml
version="1.0" encoding="utf-8" ?>
<
pets
>
<
cat
color="black" weight="10">
<
price
>100</
price
>
<
desc
>this is a black cat</
desc
>
</
cat
>
<
cat
color="white" weight="9">
<
price
>80</
price
>
<
desc
>this is a white cat</
desc
>
</
cat
>
<
cat
color="yellow" weight="15">
<
price
>80</
price
>
<
desc
>this is a yellow cat</
desc
>
</
cat
>
<
dog
color="black" weight="10">
<
price
>100</
price
>
<
desc
>this is a black dog</
desc
>
</
dog
>
<
dog
color="white" weight="9">
<
price
>80</
price
>
<
desc
>this is a white dog</
desc
>
</
dog
>
<
dog
color="yellow" weight="15">
<
price
>80</
price
>
<
desc
>this is a yellow dog</
desc
>
</
dog
>
</
pets
>
|
XPath的語法:
1. XPath中的符號
符號 |
說明 |
示例 |
示例說明 |
/ |
表示從根節點開始選擇 |
/pets |
選擇根節點pets |
表示節點和子節點之間的間隔符 |
/pets/dog |
選擇pets節點下的dog節點 |
|
//xx |
表示從整個xml文檔中查找,而不考慮當前節點位置 |
//price |
選擇文檔中所有的price節點 |
. |
單個英文半角句點表示選擇當前節點 |
/pets/. |
選擇pets節點 |
.. |
雙點,表示選擇父節點 |
/pets/dog[0]/.. |
表示pets節點,也就是第一個dog節點的父節點 |
@xx |
表示選擇屬性 |
//dog/@color |
表示選擇所有dog節點的color屬性集合 |
[…] |
中括號表示選擇條件,括號內為條件 |
//dog[@color=’white’] |
所有color為white的dog節點 |
//dog[/price<100] |
所有price字節點值小於100的dog節點 |
||
中括號內數字為節點索引,類似c#等語言中的數組,數組下標是從1開始的 |
//dog[1] |
第1個dog節點 |
|
//dog[last()] |
最后一個dog節點,last()是xPath內置函數 |
||
| |
單豎杠表示合並節點結合 |
//dog[@color=’white’] | //cat[@color=’white’] |
color屬性為white的dog節點和color屬性為white的cat節點 |
* |
星號表示任何名字的節點或者屬性 |
//dog/* |
表示dog節點的所有子節點 |
//dog/@* |
表示dog節點的所有屬性節點 |
XPath是XML的查詢語言,和SQL的角色很類似。以下面XML為例,介紹XPath的語法。下面的一些資料是幾年前學習這個的時候,從網絡以及博客園獲取的一些資料,暫時找不到出處,例子和文字基本都是借鑒,再次謝過。如果大家發現類似的一起文章,告訴我鏈接,我加上引用。下面的Xpath的相關表達也很基礎,基本足夠用了。
<?xml version="1.0"encoding="ISO-8859-1"?> <catalog> <cd country="USA"> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <price>10.90</price> </cd> </catalog>
定位節點:XML是樹狀結構,類似檔案系統內數據夾的結構,XPath也類似檔案系統的路徑命名方式。不過XPath是一種模式(Pattern),可以選出XML檔案中,路徑符合某個模式的所有節點出來。例如要選catalog底下的cd中所有price元素可以用:
/catalog/cd/price
如果XPath的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。以下的語法會選出文件中所有叫做cd的元素(在樹中的任何層級都會被選出來)://cd
選擇未知的元素:使用星號(*)可以選擇未知的元素。下面這個語法會選出/catalog/cd的所有子元素:
/catalog/cd/*
以下的語法會選出所有catalog的子元素中,包含有price作為子元素的元素。
/catalog/*/price
以下的語法會選出有兩層父節點,叫做price的所有元素。
/*/*/price
要注意的是,想要存取不分層級的元素,XPath語法必須以兩個斜線開頭(//),想要存取未知元素才用星號(*),星號只能代表未知名稱的元素,不能代表未知層級的元素。
選擇分支:使用中括號可以選擇分支。以下的語法從catalog的子元素中取出第一個叫做cd的元素。XPath的定義中沒有第0元素這種東西。
/catalog/cd[1]
以下語法選擇catalog中的最后一個cd元素:(XPathj並沒有定義first()這種函式喔,用上例的[1]就可以取出第一個元素。
/catalog/cd[last()]
以下語法選出price元素的值等於10.90的所有/catalog/cd元素
/catalog/cd[price=10.90]
選擇屬性:在XPath中,除了選擇元素以外,也可以選擇屬性。屬性都是以@開頭。例如選擇文件中所有叫做country的屬性:
//@country
以下語法選擇出country屬性值為UK的cd元素
//cd[@country='UK']