XPath
XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。
XPath的需要理解的相关概念:XML的节点,元素,属性,原子值(文本),处理指令,注释,根节点(文档节点),命名空间以及对节点间的关系如:父(Parent),子(Children),兄弟(Sibling),先辈(Ancestor),后代(Descendant)等等。
1) 节点关系
节点关系 |
说明 |
父节点Parent |
每个元素或属性都有一个父节点 |
子节点Children |
元素节点可以有0个、1个或多个子节点 |
兄弟节点Sibling |
父节点相同的节点称之为兄弟节点 |
祖先节点Ancestor |
节点的父节点、父节点的父节点一直到根节点 |
后代节点Descendant |
节点的子节点,子节点的子节点...... |
2) XPath语法与XPath路径表达式 的相关概念
- 路径表达式语法
- 相对/绝对路径
- 表达式上下文
- 谓词(筛选表达式)及轴的概念
- 运算符及特殊字符
- 常用表达式实例
- 函数及说明
- XPath使用路径表达式来访问XML中的节点或节点集,每个XPath表达式总是由一个或多个步(step)组成的,多个步直接使用斜线分隔。
路径表达式语法
1. 路径 = 相对路径 | 绝对路径
2. XPath路径表达式 = 步进表达式 | 相对路径 "/"步进表达式。
3. 步进表达式=轴 节点测试 谓词 ( 轴::节点测试[限定谓语] )
说明:
相对路径与绝对路径
绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...。
相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首。
表达式上下文(Context):
上下文其实表示一种环境。以明确当前XPath路径表达式处在什么样的环境下执行。例如同样一个路径表达式处在对根节点操作的环境和处在对某一个特定子节点操作的环境下执行所获得的结果可能是完全不一样的。也就是说XPath路径表达式计算结果取决于它所处的上下文。
步进表达式
轴::节点测试[限定谓语]
每个步都通过了3次筛选,第一次是使用“轴”选择节点方向,第二次使用“节点测试”选取在指定轴方向上的部分节点,第三次则是使用“限定谓语”来对选中的节点进一步过滤。
(1)轴:在XPath中,有下面列表中的各种轴:
轴 |
简化写法 |
说明 |
ancestor |
选取当前节点的所有先辈(父、祖父等)节点 |
|
ancestor-or-self |
选取当前节点的所有先辈(父、祖父等)节点以及当前节点本身 |
|
attribute |
@ |
选取当前节点的所有属性节点,如果当前节点不是元素节点,则attribute轴方向上的节点集为空 |
child |
省略不写 |
选取当前节点的所有子节点 |
descendant |
// |
选取当前节点的所有后代节点(子、孙等) |
descendant-or-self |
选取当前节点的所有后代节点(子、孙等)以及当前节点本身 |
|
following |
选取文档中当前节点的结束标签之后的所有节点,不会包含当前节点的后代节点和属性节点 |
|
following-sibling |
选取文档中当前节点的结束标签之后的所有兄弟节点 |
|
namespace |
选取当前节点的所有命名空间节点,当前节点不是元素节点,则namespace轴方向上的节点集为空 |
|
parent |
.. |
选取当前节点的父节点 |
preceding |
选取文档中当前节点的开始标签之前的所有节点,不会包含当前节点的后代节点和属性节点 |
|
preceding-sibling |
选取文档中当前节点的开始标签之前的所有兄弟节点 |
|
self |
. |
选取当前节点 |
(2)节点测试:节点测试用于从指定轴方向上选取所匹配的特定的节点,在XPath中,常用的节点测试语法如下表所示:
节点测试 |
说明 |
nodename |
从指定轴方向上选出具有nodename的节点 如child::book选择当前节点的所有book子节点 descendant::book选择当前节点的所有book后代节点(包括book子节点、孙子节点等) |
node() |
选择指定轴匹配的所有类型的节点 |
text() |
选择指定轴匹配的所有文本类型的节点 如child::text()选择当前节点的所有文本子节点 descendant::text()选择当前节点的所有文本后代节点(包括文本子节点、文本孙子节点等) |
comment() |
选择指定轴匹配的所有注释节点 |
processing-instruction |
选择指定轴匹配的所有处理指令节点 |
* |
节点测试中的通配符,表示所有,也即不进行过滤 |
(3)限定谓语:每个步中可以接受0个或多个限定谓语,用于进一步过滤所选取的节点集,限定谓语放在方括号中,通常限定谓语返回一个boolean值。看下面的一些例子:
路径表达式 |
结果 |
/bookstore/book[1] |
选取属于 bookstore 元素的子元素的第一个 book 元素。 |
/bookstore/book[last()] |
选取属于 bookstore 元素的子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] |
选取属于 bookstore 元素的子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] |
选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] |
选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] |
选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] |
选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title |
选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
常用运算符及特殊字符:
运算符/特殊字符 |
说明 |
/ |
此路径运算符出现在模式开头时,表示应从根节点选择。 |
// |
从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降。 |
. |
当前上下文。 |
.. |
当前上下文节点父级。 |
* |
通配符;选择所有元素节点与元素名无关。(不包括文本,注释,指令等节点,如果也要包含这些节点请用node()函数) |
@ |
属性名的前缀。 |
@* |
选择所有属性,与名称无关。 |
: |
命名空间分隔符;将命名空间前缀与元素名或属性名分隔。 |
( ) |
括号运算符(优先级最高),强制运算优先级。 |
[ ] |
应用筛选模式(即谓词,包括"过滤表达式"和"轴(向前/向后)")。 |
[ ] |
下标运算符;用于在集合中编制索引。 |
| |
两个节点集合的联合,如://messages/message/to | //messages/message/cc |
- |
减法。 |
div, |
浮点除法。 |
and, or |
逻辑运算。 |
mod |
求余。 |
not() |
逻辑非 |
= |
等于 |
!= |
不等于 |
特殊比较运算符 |
< 或者 < <= 或者 <= > 或者 > >= 或者 >= 需要转义的时候必须使用转义的形式,如在XSLT中,而在XMLDOM的scripting中不需要转义。 |
XPath与DOM
调用XPath的evaluate方法。 返回的对象类型与XPathConstants的类型一致。
XPathFactory xpathFactory=XPathFactory.newInstance();
XPath xpath=xpathFactory.newXPath();
NodeList list=(NodeList)xpath.evaluate(expression,doc,
XPathConstants.NODESET);
XPathConstants 类中的常量,它们是:
XPathConstants.NODESET -------NodeList
XPathConstants.NODE -------Node
XPathConstants.STRING --------String
XPathConstants.BOOLEAN --------boolean
XPathConstants.NUMBER --------number
当请求 Boolean返回类型时,如果选中了一个或多个节点,则返回 Boolean.TRUE,否则返Boolean.FALSE。String返回类型是从文本节点、注释节点或指令处理节点检索字符数据的便捷方法。当用于元素节点上时,返回子文本节点的值。
PS: XPath的evaluate方法,有很多重载的方法。可以根据实际情况选择。
Xpath与DOM4J
采用xpath查找需要引入jaxen-xx-xx.jar,否则会报java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常。
1)直接调用document的selectSingleNode或selectNodes方法获取节点对象。
List list=document.selectNodes("/books/book/@show");
参考文档:
http://www.w3school.com.cn/xpath/xpath_intro.asp
http://www.cnblogs.com/fdszlzl/archive/2009/06/02/1494836.html
http://blog.csdn.net/shijinupc/article/details/7655010
http://www.runoob.com/xpath/xpath-tutorial.html
XPath的更多相关文章
- XPath <第四篇>
.Net框架下的System.Xml.XPath命名空间提供了一系列的类,允许你应用XPath数据模式查询和展示XML文档数据. 一.XPath介绍 XPath有七种类型的节点:元素.属性.文本.命名 ...
- EnjoyingSoft之Mule ESB开发教程第四篇:Mule Expression Language - MEL表达式
目录 1. MEL的优势 2. MEL的使用场景 3. MEL的示例 4. MEL的上下文对象 5. MEL的Variable 6. MEL访问属性 7. MEL操作符 本篇主要介绍Mule表达式语言 ...
- 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)
从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- 第四篇 Entity Framework Plus 之 Batch Operations
用 Entity Framework 进行 增,删,改.都是基于Model进行的,且Model都是有状态追踪的.这样Entity Framework才能正常增,删,改. 有时候,要根据某个字段,批量 ...
- 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)
解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...
- 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)
解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...
- 深入理解javascript作用域系列第四篇——块作用域
× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...
- 前端工程师技能之photoshop巧用系列第四篇——图片格式
× 目录 [1]图片格式 [2]保存设置 前面的话 对于前端来说,图片格式是需要重要掌握的知识.本文是photoshop巧用系列第四篇——图片格式 图片格式 目前在前端的开发中常用的图片格式有jpg. ...
- 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理
温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...
随机推荐
- UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解
(1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...
- 浅谈android binder机制
binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...
- SPSS数据分析—多分类Logistic回归模型
前面我们说过二分类Logistic回归模型,但分类变量并不只是二分类一种,还有多分类,本次我们介绍当因变量为多分类时的Logistic回归模型. 多分类Logistic回归模型又分为有序多分类Logi ...
- java中的成员变量和局部变量区别
1.作用域不同 成员变量的作用域在整个类内部都是可见,可用的: 局部变量的作用域仅限于定义它的方法,不能被其它方法调用: 2.初始值不同 java会给成员变量一个初始值,初始值为0: java不会给局 ...
- JAVA04类与对象之课后问题解决
1.验证ClassAndObjectTest.java(使用自定义类) public class ClassAndObjectTest { public static void main(String ...
- DevExpress实现为TextEdit设置水印文字
本文实例展示了DevExpress实现为TextEdit设置水印文字的方法,是一个很实用的技巧.分享给大家供大家参考. 转自 http://blog.csdn.net/yh0503/article/d ...
- 定位 position: absolute & relative
[position:absolute] 意思是绝对定位,他默认参照浏览器的左上角,配合TOP.RIGHT.BOTTOM.LEFT(下面简称TRBL)进行定位,有以下属性: 1)如果没有TRBL,以父级 ...
- Selenium VS QTP
Selenium系列 QTP 适用结构 B/S结构 C/S.B/S结构 适用人员 有一定代码基础(Java.C#.Python.Ruby) 对编程不是很熟悉的.厌烦了做手工功能测试的.想快速进 ...
- C#验证码的生成
HTML <ul> <li>验证码:</li> <li> <img src="/Login/GetValidateCode?ID=1&q ...
- Android开发--Adapter的应用
1.简介 Adapter的作用是为GridView,ListView等界面控件与数据之间搭建桥梁,每当列表里的每一项显示到页面时,都会调用到Adapter的getView方法 返回一个View.在An ...