本文主要介绍Xpath语法格式总结的相关内容,比较全面。在这里想和大家分享一下。如有不足,请补充。
我在工作中经常用到XPath的相关知识,但是每次在一些关键的地方总是记不住或者认识不清楚,所以每次都免不了要去查一些零碎的知识,感觉很烦,浪费时间,所以我会对XPath进行总结和归纳。
在本文中,您将了解到:
XPath简介
XPath表达式的解释
XPath在DOM、XSLT和XQuery中的应用
XPath简介
XPath是W3C标准。它的主要用途是定位XML1.0或XML1.1文档节点树中的节点。目前有XPath1.0和XPath2.0两个版本,其中Xpath1.0在1999年成为W3C标准,而XPath2.0标准是在2007年制定的。参见:http://www.w3.org/TR/xpath20/获取W3C关于XPath的详细英文文档。
XPath是一种表达式语言,它的返回值可能是节点、节点集、原子值以及节点和原子值的混合。XPath2.0是XPath1.0的超集,是XPath1.0的扩展,可以支持更丰富的数据类型,而且XPath2.0与XPath1.0保持了相对较好的向后兼容性,XPath2.0几乎所有返回的结果都可以与XPath1.0相同,此外,XPath2.0还是XSLT2.0和XQuery1.0查询定位节点的主要表达式语言。XQuery1.0是XPath2.0的扩展,在XSLT和XQuery中使用XPath表达式定位节点的知识将在后面的例子中介绍。
在学习XPath之前,你要了解一些XML节点、元素、属性、原子值(文本)、处理指令、注释、根节点(文档节点)、命名空间的概念以及节点之间的关系,比如:父节点、子节点、兄弟节点、祖先节点和后代节点。这里就不解释了。
XPath路径表达式
在下一节中,您将学习:
路径语法
相对/绝对路径
表达式上下文
谓词(过滤表达式)和轴的概念
运算符和特殊字符
常用表达的例子
功能描述
下面是一个示例Xml文件。以下描述和示例都基于这个XML文件。
?xml版本='1.0 '编码='UTF-8 '?
!-使用XMLSpy v2008版本编辑。2名SP2(http://www.altova.com)管理员-
?XML-style sheet type=' text/xsl ' href=' messages . xsl ' rel=' external no follow '?
信息
消息id='1 '
sendergukaitong@gmail.com/sender
toanonymous@gmail.com
组名='它'
address111@gmail.com/address
address222@gmail.com/address
addressaaa@gmail.com/address
addressbbb@gmail.com/address
addressccc@gmail.com/address
/组
/至
这是一个样本/主题
日期时间日期='2008-12-11 '时间='12:00:00 '格式=' 12/11/2008 12:00AM ' 2008-12-11t 12:00:00Z/日期时间
身体
你有兴趣吗?
附件
附件id='1 '
消息id=“0”
senderanonymous@gmail.com/sender
togukaitong@gmail.com/to
身体
我们强烈推荐以下书籍
books xmlns:Amazon=' http://www . Amazon . com/books/schema '
亚马逊:书
nameProfessional C# 2008 /name
国家美国/国家
价格37.79英镑/个
2007年/年
/亚马逊:书
亚马逊:书
名称Microsoft Visual C# 2008分步指南/名称
国家美国/国家
价格26.39元/个
2008年/年
/亚马逊:书
亚马逊:书
nameC#深度/名称
国家美国/国家
价格29.69/价格
2006年/年
/亚马逊:书
亚马逊:书
Java/name中的名称思维
国家美国/国家
价格23.69英镑/个
2004年/年
/亚马逊:书
/书籍
/body
/消息
/附件
/附件
/body
/消息
消息id='2 '
sender333@gmail.com/sender
to444@gmail.com/to
主题无标题/主题
身体/
/消息
/消息
路径语法:
Path=相对路径|绝对路径
路径表达式=步骤表达式|相对路径'/'步骤表达式。
步骤表达式=轴节点测试谓词
描述:
其中轴表示步骤表达式选择的节点与当前上下文节点之间的树关系(层次关系),节点测试指定步骤表达式选择的节点的名称扩展,谓词相当于过滤表达式以进一步过滤和细化节点集。
谓词可以是0或更多。多个谓词由逻辑运算符and、or连接。使用逻辑not函数。
请看一个典型的XPath查询表达式:/messages/message//child:node()[@ id=0],其中/messages/message是路径(绝对路径以'/'开头),child:是在子节点下选择的轴,node()是选择所有节点的节点测试。[@id=0]是一个谓词,意思是选择属性id和值为0的所有节点。
相对路径与绝对路径:
如果'/'在XPath表达式的开头,则表示文档的根元素,(表达式的中间用作分隔符来分隔每个步进表达式)
例如,/messages/message/subject是绝对路径表示,表示从文档的根开始搜索节点。假设当前节点在第一个消息节点[/messages/message[1]],路径表达式subject(路径前没有'/')称为相对路径,表示从当前节点开始搜索。有关详细信息,请参见下面描述的“表达式上下文”。
表达式上下文:
其实语境就是一个环境。明确当前XPath路径表达式是在什么环境下执行的。例如,如果在操作根节点的环境中和在操作特定子节点的环境中执行相同的路径表达式,则获得的结果可能完全不同。也就是说XPath路径表达式的求值结果取决于它的上下文。
XPath上下文基本有以下几种:
当前节点(。/):
例如,/sender表示选择当前节点下的发送方节点集(相当于下面提到的‘特定元素’,如:sender)
父节点(./):
举个例子,/sender表示选择当前节点的父节点下的发送方节点集。
元素(/):
例如,/messages表示从文档根节点下的消息节点集中进行选择。
根(/*):
这里的*代表所有节点,但是根元素只有一个,所以这里代表根节点。/*返回的结果与/messages返回的结果相同。
消息节点。
递归下降(//):
例如,当前上下文是“消息”节点。那么//sender将返回以下结果:
/消息//发件人:
sendergkt1980@gmail.com/sender
sender111@gmail.com/sender
sender333@gmail.com/sender
/messages/message[1]//发件人:
sendergkt1980@gmail.com/sender
sender111@gmail.com/sender
我们可以看到XPath表达式返回的结果是:从当前节点开始,逐步递归搜索当前节点下的所有子节点,找到满足条件的节点集。
特定元素
例如,sender:表示选择当前节点下的发送方节点集,相当于(。/发件人)
注意:执行XPath时必须注意上下文。即XPath表达式当前在哪个节点下执行。这在XMLDOM中很重要。比如在XMLDOM中,selectNodes,selectSingleNode方法的参数都是XPath表达式,这个XPath表达式的执行上下文就是调用这个方法的节点及其环境。更多信息,请访问:http://www.w3.org/TR/xpath20/
谓词(过滤表达式)和轴的概念:
XPath的谓词是过滤器表达式,类似于SQL的where子句。
轴名称
结果
祖先
选择当前节点的所有祖先(父亲、祖父等)。)
祖先或自我
选择所有祖先(父亲、祖父等。)和当前节点本身。
属性
选择当前节点的所有属性。
儿童
选择当前节点的所有子元素。
后裔
选择所有后代元素(子元素、孙元素等。)的当前节点。
自我的后代
选择所有后代元素(子元素、孙元素等。)和当前节点本身。
跟随
选择文档中当前节点结束标记之后的所有节点。
命名空间
选择当前节点的所有命名空间节点。
父母
选择当前节点的父节点。
在前的
直到该节点的所有父节点,依次选择每个父节点之前的所有对等节点。
前兄弟姐妹
选择当前节点之前的所有同级节点。
自己
选择当前节点。
运算符和特殊字符:
运算符/特殊字符
解释
/
这个路径操作符出现在模式的开头,表明应该从根节点中选择它。
//
从当前节点递归下降。当这个路径操作符出现在模式的开始时,意味着它应该从根节点开始递归下降。
当前上下文。
.
父当前上下文节点。
*
通配符;无论元素名称如何,都会选择所有元素节点。(不包括文本、评论、说明等节点。如果你想包含这些节点,请使用node()函数)
@
名称的前缀。
@*
选择所有属性,不考虑名称。
:
命名空间分隔符;将名称空间前缀与元素名或属性名分开。
( )
括号运算符(最高优先级),强制操作优先级。
[ ]
应用过滤模式(即谓词,包括'过滤表达式'和'轴(向前/向后)')。
[ ]
下标运算符;用于在集合中建立索引。
|
两个节点集的联合,例如://messages/message/to |//messages/message/cc
-
减法。
div,
浮点除法。
并且,或者
逻辑运算。
现代的
要求更多。
不是()
逻辑非
=
胜任
!=
不等于
特殊比较运算符
或者lt;
=或lt;=
或者gt;
=或gt;=
Escape必须在需要的时候使用,比如在XSLT中,而不是在XMLDOM的脚本中。
常用表达的例子:
/
文档根文档根。
/*
选择文档根下的所有元素节点,即根节点(XML文档只有一个根节点)。
/node()
根下的所有节点(包括文本节点、评论节点等。)
/text()
查找文档根节点下的所有文本节点。
/消息/消息
消息节点下的所有消息节点
/messages/message[1]
消息节点下的第一个消息节点
/messages/message[1]/self:node()
第一个消息节点(self轴表示自身,node()表示选择了所有节点)
/messages/message[1]/node()
第一个消息节点下的所有子节点
/messages/message[1]/*[last()]
第一个消息节点的最后一个子节点
/messages/message[1]/[last()]
错误,谓词前面必须有节点或节点集。
/messages/message[1]/node()[last()]
第一个消息节点的最后一个子节点
/messages/message[1]/text()
第一个消息节点的所有子节点
/messages/message[1]//text()
在第一个消息节点下,递归下降以查找所有文本节点(无限深度)
/messages/message[1]/child:node()
/messages/message[1] /node()
/messages/message[position()=1]/节点()
//message[@id=1] /node()
第一个消息节点下的所有子节点
//message[@id=1] //child:node()
递归所有子节点(无限深度)
//message[position()=1]/node()
选择id=1的消息节点和id=0的消息节点。
/messages/message[1] /parent:*
消息节点
/messages/message[1]/body/attachments/parent:节点()
/messages/message[1]/body/attachments/parent:*/messages/message[1]/body/attachments/.
附件节点的父节点。只有一个父节点,因此node()和*返回相同的结果。
(.还指示父节点。指示它自己的节点)
//message[@id=0]/ancestor:*
祖先轴代表所有祖父母、父亲、祖父等。
向上递归
//message[@ id=0]/ancestor-or-self:*
向上递归,包含自身
//message[@ id=0]/ancestor:node()
使用*再添加一个文档根元素。
/messages/message[1]/descendant:node()
//messages/message[1]//node()
递归向下查找消息节点的所有节点
/messages/message[1]/发件人/关注:*
找到第一个消息节点的发送者节点之后的所有兄弟节点,并递归地向下搜索每个兄弟节点。
//message[@ id=1]/sender/following-sibling:*
查找id=1的消息节点的发送者节点的所有后续兄弟节点。
//message[@ id=1]/datetime/@ date
查找id=1的消息节点的datetime节点的date属性。
//message[@ id=1]/datetime[@ date]
//消息/日期时间[属性:日期]
查找id=1的消息节点的日期属性为的所有日期时间节点
//消息[日期时间]
查找具有日期时间节点的所有消息节点
//消息/日期时间/属性:*
//消息/日期时间/属性:节点()
//消息/日期时间/@*
返回消息节点下日期时间节点的所有属性节点。
//消息/日期时间[属性:*]
//message/datetime[attribute:node()]
//消息/日期时间[@*]
//消息/日期时间[@node()]
选择所有具有属性的日期时间节点。
//属性:*
选择根节点下的所有属性节点。
//message[@ id=0]/body/preceding:node()
选择订单正文节点所在节点之前的所有同级节点。(搜索顺序是:先找到正文节点的顶节点(根节点),得到根节点标签之前的所有兄弟节点。执行完毕后,继续下一级,按顺序获取节点标签前的所有兄弟节点,以此类推。)
注意:查找兄弟节点是顺序的,而不是递归的。
//message[@ id=0]/body/preceding-sibling:node()
按顺序查找body标记之前的所有同级节点。(和上一个例子最大的区别之一是,它不是从顶层开始逐层搜索body节点。我们可以理解为少了一个循环,只搜索当前节点之前的同级节点)
//message[@ id=1]//*[namespace:Amazon]
在id=1的所有消息节点下查找所有带有amazon名称空间的节点。
//命名空间:*
文档中的所有命名空间节点。(包括默认的名称空间xmlns:xml)
//message[@ id=0]//books/*[local-name()=' book ']
选择“书籍”下的所有书籍节点,
注意:因为book节点定义了名称空间amazone:book。如果写成//message[@id=0]//books/book,就找不到节点了。
//message[@ id=0]//books/*[local-name()=' book ' and namespace-uri()=' http://www . Amazon . com/books/schema ']
选择books下的所有book节点(节点名称和名称空间匹配)。
//message[@ id=0]//books/*[local-name()=' book '][year 2006]
选择年节点值为2006的书节点
//message[@ id=0]//books/*[local-name()=' book '][1]/year 2006
指示第一个书节点的年节点值是否大于2006。
Xs:布尔值:真
功能和描述:
令人欣慰的是,XPath函数与XSLT、XQuery等函数库共享。函数库为我们提供了各种功能丰富的函数调用,我们也可以自定义自己的函数。这里就不一一解释各个功能的用法了。对于中文,请参考本网站,https://www.jb51.net/w3school/xpath/index.htm.
XPath在DOM、XSLT和XQuery中的应用
DOM:
!' DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN ' ' http://www . w3 . org/TR/XHTML 1/DTD/XHTML 1-Transitional . DTD '
html xmlns=' http://www . w3 . org/1999/XHTML '
头
标题XPath测试/标题
/头
身体
脚本语言='javascript '类型='text/javascript '
var XML doc=new ActiveX object(' Microsoft。XML DOM’);
xmlDoc.async=' false
XML doc . load(' messages . XML ');
XML doc . set property(' selection language ',' XPath ');
var sPath='/messages/message[1]//books/*[local-name()=' book ']';
var book nodes=XML doc . select nodes(sPath);
document . write(“ul”);
for(var I=0;i bookNodes.lengthi ) {
document.write('李'书节点[i].子节点[0]。text '/Li ');
}
document . write('/ul ');
/脚本
/body
/html
注意:
如果我们使用新的ActiveX object(‘微软。XMLDOM’),我们要注意这一点:因为早期XML DOM的SelectionLanguage属性默认是正则表达式,不是XPath语言。所以需要指定这样的语句xmldoc.setproperty('选择语言',' XPath ');支持XPath查询表达式。
如果SelectionLanguage的属性值没有指定为XPath,请注意以下情况:
数组下标从0开始(我们知道在XPath查询表达式中数组下标从1开始)。XPath查询表达式中不支持XPath函数。
总结
这就是本文对Xpath语法格式的总结。希望对你有帮助。感兴趣的朋友可以参考:MYSQL updatexml()函数错误注入分析,OGNL表达式基本语法和用法详解,前端常见跨域解决方案(all)等。如果您有任何问题,请随时留言。欢迎讨论交流。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。