Xpath问题总结

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几个,而div90几个。

所以,相对路径,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.最方便的查找路径方式

审查元素,右键copyxpathFirefoxchrome都适用),可以直接给出从根开始的xpath路径。

5.最后推荐几款插件

1.firfox下的xpathchecker,输入xpath路径之后,给出解析结果,可以很好的判断路径的对错。需要注意的是当firefox加载新的网页之后要重新打开xpathchecker,让它重新转换加载XML文档。

2.Chrome下的xpathfinder也有类似功能。

3.Mac下的xpathexplorer可以在网页中直接选取内容生成从根开始的xpath路径。

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念