1.什么是xpath
Xpath使用路径表达式在XML文档中进行导航,解析到路径跟踪到的XML元素。
2.xpath路径表达式
路径表达式是xpath的传入参数,xpath使用路径表达式对XML文档中的节点(或者多个节点)进行定位。
路径表达式类似这种:/html/body/div[@class=”content”](稍后解释规则)
3.路径表达式有如下几种常见的组成结构
比较推荐的xpathManual
1.绝对路径方式(从根节点开始导航)
绝对路径方式是从根节点开始选取,然后一级一级的往想要去的节点导航。以”/”开始。这种参数会让xpath有着更高的效率,稍后会做解释。
2.相对路径方式
这种方式不用考虑相对于根节点,想要查找的节点的所有级别路径,只需要知道当前节点或者当前节点的上下几个级别的节点即可,在人为查找路径的时候,会更方便一些。
3.属性结构
因为一个XML文档可能有多个相同标签在同一级别,例如下面这个例子
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<divid=”all”>
<divclass=”figure-1”>
<titlelang="eng">HarryPotter</title>
<p>29.99</p>
</div>
<divclass=”figure-2”>
<titlelang="eng">LearningXML</title>
<p>39.95</p>
想要选择<divclass=”figure-1”>这个标签的内容,需要对div标签进行更详细的说明,才能区别于其他的同级别标签(也有另外的方法)。’@’属性可以用在这里,路径表达式就是
//div[@class=”figure-1”](这里选择相对方式)
4.路径表达式的几个小坑
0.效率问题
Xpath的路径表达式参数如果是从根元素开始的,一定是效率最高的。这点容易解释,省去了很多门口的辨别过程。
但是因为有时候从根元素开始并不好找(后来借助插件这个不成问题),或者是出于自己封装的解析函数的泛型化的要求,需要相对路径。那么相对路径的选择方式就值得思考了。
一下是我的一些思考,没参考过实现源码,但经过测试。
想到过相对路径如果往上级多写几层,应该会提升效率,但是测试之后,时间反而增加了2-3倍。
初始例子是这样的'//span[@id="media_span"]/span',
加了几层变成这样'//div/div/div/span[@id="media_span"]/span'
我觉得xpath的索引方式很可能像NTFS文件系统一样。统计过当篇的元素个数,span20几个,而div是90几个。
所以,相对路径,div这种极易出现的标签元素尽量不要放在起始节点。
从根节点开始解析比以上span开始的例子相比,只快了一点(错略测试多篇文档,10万次解析差2秒)。
1.不能跨级
在选择路径表达式的时候,不能出现跨级别的元素包含,否则路径表达式是不能被xpath解析的。
还拿上图举例,不可以写//div[@id=”all”]/title去解析divclass=”figure-1”下面的title标签,这就是一种跨级。
2.可以使用’|’,简化解析
使用’|’操作符可以让xpath的在XML文档上按照多个路径表达式解析,在解析新闻网页的新闻条目时,很奏效。
例如,//div[@id="syncad_1"]/h1|//div[@id="syncad_1"]/p可以对新浪新闻页做两次解析,对应或操作符的两个参数。Xpath解析结果如下图:
3.注意命名空间
当XML遇上命名空间无法解析的时候,加上对应的命名空间即可(namespace上图也可参考)。更高级的操作方式可见手册。
4.最方便的查找路径方式
审查元素,右键copyxpath(Firefox和chrome都适用),可以直接给出从根开始的xpath路径。
5.最后推荐几款插件
1.firfox下的xpathchecker,输入xpath路径之后,给出解析结果,可以很好的判断路径的对错。需要注意的是当firefox加载新的网页之后要重新打开xpathchecker,让它重新转换加载XML文档。
2.Chrome下的xpathfinder也有类似功能。