xpath的语法(转载自:http://www.cnblogs.com/jianjialin/archive/2009/02/01/1382056.html),在原文基础上稍做修改。
XPath 是XML的查询语言,和SQL的角色很类似。以下面HTML为例,介绍XPath 的语法。
[b]定位节点[/b]
XML是树状结构,类似档案系统内数据夹的结构,XPath也类似档案系统的路径命名方式。不过XPath 是一种模式(Pattern),可以选出 XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:
[color=blue]html/body/div [/color]
如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做div的元素(在树中的任何层级都会被选出来):
[color=blue]//div[/color]
看到这里时我还是不太清楚/和//的区别,测试如下:
/html/body/div/div/div :可以找到三个div,分别是class为div111、div112、div211的div
//div/div/div :可以找到四个div,分别是class为div111、div1111、div112、div211的div
由此可知,通过/查找时只会找到绝对匹配的元素,通过//查找时可以找到符合条件的元素及其子元素
[b]选择未知的元素[/b]
使用星号(Wildcards,*)可以选择未知的元素。
[color=blue]/html/body/*[/color]:选择/html/body/下的所有子元素
[color=blue]/html/body/*/p[/color]:选择/html/body/下任何一个节点的p节点
[color=blue]//div/*/p[/color]:选择父节点类型为任意元素,父父节点为div的所有p节点
[color=blue]/*/*/price[/color]:选择有两层父节点,叫做price的所有元素
[color=blue]//*[/color]:选择文件中的所有元素
要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。
[b]选择分支[/b]
使用中括号可以选择分支。
[color=blue]/html/body/div[1][/color]:选择body下的子元素中第一个div元素。XPath的定义中没有第0元素这种东西。
[color=blue]/html/body/cd[last()][/color]:选择body下的最后一个div元素(XPath并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素)。
[color=blue]/html/body/div[p][/color]:选出body下含有p子元素的所有第一次div元素。
[color=blue]//div[p='this is the first p'][/color]:选出div中包含p子节点且p元素的值为this is the first p的所有div元素
[color=blue]//div[p='this is the first p']/p[/color]:选出p的值为this is the first p的所有div下的p元素
[b]选择一个以上的路径[/b]
使用Or操作数(|)就可以选择一个以上的路径。例如:
[color=blue]/html/body/div/div | /html/body/div/p [/color]:选择body下的div下的所有div及p元素
[b]选择属性[/b]
在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。
[color=blue]//p[@class][/color]:选择所有具有class属性的p元素
[color=blue]//p[@*][/color]:选择含有属性的所有cd元素
[color=blue]//div[@class='UK'][/color]:选择country属性值为UK的div元素
[color=blue]//p[@class='UK'][@name='hyddd'][/color]:选择class属性值为UK,name属性值为hyddd的p元素
一篇更详细的讲解xpath的文章:
http://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html
XPath 是XML的查询语言,和SQL的角色很类似。以下面HTML为例,介绍XPath 的语法。
<html>
<head>
</head>
<body>
<div class="div1" style="height: 40px; width: 1440px;" region="north">
<div class="div11">
<div class="div111">
<div id="div1111">
<p>this is the first p</p>
</div>
</div>
<div class="div112" style="border: none;">
<p>this is the second p</p>
</div>
</div>
</div>
<div class="div2">
<div class="div21" style="border: none;">
<div class="div211" style="border: none;">
<p>this is the third p</p>
</div>
</div>
</div>
<div class="div3">
<p>this is the fourth p</p>
<div class="div31" style="border: none;">
</div>
</div>
</body>
</html>
[b]定位节点[/b]
XML是树状结构,类似档案系统内数据夹的结构,XPath也类似档案系统的路径命名方式。不过XPath 是一种模式(Pattern),可以选出 XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:
[color=blue]html/body/div [/color]
如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做div的元素(在树中的任何层级都会被选出来):
[color=blue]//div[/color]
看到这里时我还是不太清楚/和//的区别,测试如下:
/html/body/div/div/div :可以找到三个div,分别是class为div111、div112、div211的div
//div/div/div :可以找到四个div,分别是class为div111、div1111、div112、div211的div
由此可知,通过/查找时只会找到绝对匹配的元素,通过//查找时可以找到符合条件的元素及其子元素
[b]选择未知的元素[/b]
使用星号(Wildcards,*)可以选择未知的元素。
[color=blue]/html/body/*[/color]:选择/html/body/下的所有子元素
[color=blue]/html/body/*/p[/color]:选择/html/body/下任何一个节点的p节点
[color=blue]//div/*/p[/color]:选择父节点类型为任意元素,父父节点为div的所有p节点
[color=blue]/*/*/price[/color]:选择有两层父节点,叫做price的所有元素
[color=blue]//*[/color]:选择文件中的所有元素
要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。
[b]选择分支[/b]
使用中括号可以选择分支。
[color=blue]/html/body/div[1][/color]:选择body下的子元素中第一个div元素。XPath的定义中没有第0元素这种东西。
[color=blue]/html/body/cd[last()][/color]:选择body下的最后一个div元素(XPath并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素)。
[color=blue]/html/body/div[p][/color]:选出body下含有p子元素的所有第一次div元素。
[color=blue]//div[p='this is the first p'][/color]:选出div中包含p子节点且p元素的值为this is the first p的所有div元素
[color=blue]//div[p='this is the first p']/p[/color]:选出p的值为this is the first p的所有div下的p元素
[b]选择一个以上的路径[/b]
使用Or操作数(|)就可以选择一个以上的路径。例如:
[color=blue]/html/body/div/div | /html/body/div/p [/color]:选择body下的div下的所有div及p元素
[b]选择属性[/b]
在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。
[color=blue]//p[@class][/color]:选择所有具有class属性的p元素
[color=blue]//p[@*][/color]:选择含有属性的所有cd元素
[color=blue]//div[@class='UK'][/color]:选择country属性值为UK的div元素
[color=blue]//p[@class='UK'][@name='hyddd'][/color]:选择class属性值为UK,name属性值为hyddd的p元素
一篇更详细的讲解xpath的文章:
http://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html