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']