Xpath—解决时问题的良药

何为良药?

由于在XML中存在一些问题和缺陷,针对这些问题就产生了响应的解决方案。如:

getElementById方法在解析XML时由于一些原因适不适合的:

首先XML中每个元素节点不一定有id属性。

其次XML中的两个元素节点可能有相同的id属性,这样getElementById这个方法就不再能保证找到我们需要的唯一节点了。针对这个原因Xpath就诞生了。

Xpath是什么?

Xpath是如何产生的呢?它存在的必要是什么呢?接下来就让我们一一解答自己心中的疑问:

首先Xpath全称是XML Path Language(XML路径语言),适用于确定XML文档中某节点位置的语言。XPath是
W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。因此,对 XPath 的理解是很多高级 XML应用的基础。

我们可以把它当作类似于SQL一样的查询语言,通过给出的Xpath路径信息(就像SQL命令一样)就可以从XML中查找出符合条件的节点(就像从数据库中返回需要的数据一样)

Xpath如何用?(XPath 路径表达式详解 )

一.路径表达式语法

1.路径 = 相对路径 |绝对路径

2.XPath路径表达式 =步进表达式 | 相对路径 "/"步进表达式。

3.步进表达式=轴 节点测试谓词

说明:

1.其中轴表示步进表达式选择的节点和当前上下文节点间的树状关系(层次关系),节点测试指定步进表达式选择的节点名称扩展名,谓词即相当于过滤表达式以进一步过滤细化节点集。

2.谓词可以是0个或多个。多个多个谓词用逻辑操作符and,or连接。取逻辑非用not()函数。请看一个典型的XPath查询表达式:/messages/message//child::node()[@id=0],其中/messages/message是路径(绝对路径以"/"开始),child::是轴表示在子节点下选择,node()是节点测试表示选择所有的节点。[@id=0]是谓词,表示选择所有有属性id并且值为0的节点。

二.相对/绝对路径

如果"/"处在XPath表达式开头则表示文档根元素(表达式中间作为分隔符用以分割每一个步进表达式)如:/messages/message/subject是一种绝对路径表示法,它表明是从文档根开始查找节点。假设当前节点是在第一个message节点【/messages/message[1]】,则路径表达式subject(路径前没有"/")这种表示法称为相对路径,表明从当前节点开始查找。具体请见下面所述的"表达式上下文"。

三.表达式上下文

上下文其实表示一种环境。以明确当前XPath路径表达式处在什么样的环境下执行。例如同样一个路径表达式处在对根节点操作的环境和处在对某一个特定子节点操作的环境下执行所获得的结果可能是完全不一样的。也就是说XPath路径表达式计算结果取决于它所处的上下文。

XPath上下文基本有以下几种:

1.当前节点(./):

如./sender表示选择当前节点下的sender节点集合(等同于下面所讲的"特定元素",如:sender)

2.父节点(../):

如../sender表示选择当前节点的父节点下的sender节点集合

3.根元素(/):

如/messages表示选择从文档根节点下的messages节点集合.

4.根节点(/*):

这里的*是代表所有节点,但是根元素只有一个,所以这里表示根节点。/*的返回结果和/messages返回的结果一样都是messages节点。

5.递归下降(//):

如当前上下文是messages节点。则//sender将返回以下结果:

/messages//sender:

[email protected]

[email protected]

[email protected]

/messages/message[1]//sender:

[email protected]

[email protected]

我们可以看出XPath表达式返回的结果是:从当前节点开始递归步进搜索当前节点下的所有子节点找到满足条件的节点集。

6.特定元素

如sender:表示选择当前节点下的sender节点集合,等同于(./sender)

注意:在执行XPath时一定要注意上下文。即当前是在哪个节点下执行XPath表达式。这在XMLDOM中很重要。如:在XMLDOM中的selectNodes,selectSingleNode方法的参数都是一个XPath表达式,此时这个XPath表达式的执行上下文就是调用这个方法的节点及它所在的环境。

优点:

在IE6.0及其以上版本中我们可以使用同样的方式来访问任意深度的XML数据,这给XML数据的解析操作带来了便利。

缺点:

在Firefox等浏览器中,则是使用了w3c标准的Xpath处理方式,没有IE这么简单的方式。

Xpath—解决时问题的良药

时间: 2024-10-17 15:02:53

Xpath—解决时问题的良药的相关文章

Xpath—解决这个问题的良药

何为良药? 因为在XML中存在一些问题和缺陷,针对这些问题就产生了响应的解决方式.如: getElementById方法在解析XML时因为一些原因适不适合的: 首先XML中每一个元素节点不一定有id属性. 其次XML中的两个元素节点可能有同样的id属性.这样getElementById这种方法就不再能保证找到我们须要的唯一节点了. 针对这个原因Xpath就诞生了. Xpath是什么? Xpath是怎样产生的呢?它存在的必要是什么呢?接下来就让我们一一解答自己心中的疑问: 首先Xpath全称是XM

当一个低级问题,第一次解决时,你会感受到成就;第二次解决时,你感受到责任,第三次解决时,你可能更多的感受到无力(转)

年轻的同学喜欢按学习曲线来看自己过去的每一年,但是这种方式很快就会步入到瓶颈,学习曲线增长突然会变得缓慢.在 2013 年圣诞节时,Tim 还在每天花上 10-30 分钟玩一款叫 Clash of Clans 的游戏,并邀请身边的朋友都加入了部落,当时每天的升级成长也很快.但不知道从哪一天开始,发觉升级越来越慢了,需要 2 周或者更长时间才能将一些对象升级,所以慢慢的对其失去了成就感.耐心与好奇心. 工程师对于技术的关系也是如此,刚接触第一门编程语言时候,对每一个细节充满了好奇心,发现一种新的语

一道简单的局部链表反转的问题,具体解决时的麻烦的分类

这道leetcode题,看起来是十分简单的 但解决过程中,分类有些问题 Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. class Solution {public: ListN

python selenium xpath定位时使用变量

driver.find_element_by_xpath(input[@id = "kw"]) 上面的代码,相信很多学习selenium + python 的朋友都很熟悉,就是定位百度首页搜索框的代码,如果我们想把"kw",用一个变量来表示该怎么操作呢? 目前,我知道的有两种方法,如下,是定位百度搜索框,点击搜索的代码,在XPath定位的过程中,用了变量: # encoding:utf-8 from selenium import webdriver import

[笔记]格式化jqGrid中的日期与时间,解决时分秒都显示为0

项目中的一个jqGrid列表页面的一列需要显示日期和时间,如:2011-08-10 10:20:30,查阅官方wiki文档的说明和例子,然后在colModel的需要格式化时间的列的formatter:'date'的后面加了一些 formatoptions配置,但IE和FF浏览器中都没有效果,也没提示什么错误~ 无奈官方wiki文档的日期时间格式化部分的说明和例子对我来说不够细,只好查看jquery.fmatter.js中的源代码的DateFormat部 分,还好查出来了,原来srcformat和

Selenium2+Python3.6实战(八):定位下拉菜单出错,如何解决?用select或xpath定位。

在登录界面,有时候会有几种不同的角色,针对不同角色定位到的信息是不一样的.查询资料知道定位下拉框的元素有两种方式:Xpath和select. 但是使用xpath定位时,user定位到了,登录的时候却是调用的administrator,很是费脑.几经周折,终于解决了. 1.关于user用户xpath定位:用selenium IDE录制了登录过程,查看代码才发现并没有定位到user上,而是直接输入密码登录的.这让我想到,user是默认的用户,当进入登录界面时,网页默认的用户就是user,所以可以省略

解决【win10管理员已阻止程序运行】问题时有感

今天在安装loadrunner11的时候点击setup弹出以下报错 然后试了很多方法,从网上找了各种解决方案:修改UAC.修改本地组策略,均未解决ps:本人电脑是win10家庭中文版. 研究了半天未果,最后面咨询了测试主管,他推荐我安装xftp脚本工具,安装完后将setup文件放进xftp中运行,居然神奇的可以了. ............我内心是奔溃的,自己埋头苦干,各种找资料,结果还是询问有经验的人来的有用. 这里并不是叫大家不要思考,而是遇到问题时自己想办法固然重要,但是遇到不会的问题,试

百度知道问答量破4亿解决13亿人困惑

遇到难题时,人们总是习惯于在百度知道上寻找答案,从修电脑到各种生活疑问,在百度知道上通通能够找到满意的解答.百度知道的不断壮大,已经在不知不觉间铸就了一个中国互联网的里程碑事件.     最近,百度知道宣布在其平台上的已解决问题量已经突破4亿,更加坐实全球最大中文问答平台的地位.那么,对于广大中文网民来说,百度知道已解决问题量的不断攀升又意味着什么?     "无所不知"的生活伙伴     笔者的亲身经历中,最初对百度知道印象深刻的原因,是因为一次修电脑.几年之前,笔者办公电脑怎么也连

linux内核关于uart2配置为RTS引脚时,串口无法使用的问题

前言: 在linux中,当gpio被配置为串口或者其他作用功能时,是无法再文件系统中再将该gpio进行导出(echo xx > /sys/class/gpio/export)的,内核不允许,因为你的该引脚已经作为其他功能使用. 在对linux内核进行配置时,make menuconfig 配置串口uart2为带有RTS引脚的情况.然后make编译内核,结果运行到板子上,在文件系统下确实能够导出该串口对应的gpio引脚的,这肯定是不正确的,经过测试,确实发现,此时的串口确实无法工作,像是失去了串口