XPath语法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XPath语法相关的知识,希望对你有一定的参考价值。
参考技术AXPath的语法 我们在前面已经提到过 XPath是用来帮助XSLT在XML源文档中查找定位信息的语言 在实际使用过程中 XPath和XSLT总是混在一起使用 在上面一章的语法例子中我们已经有使用到XPath的语法 只是没有明确点出 但W C将它们分成两个标准 所以我们也将它们拆成两章来讲解
XPath的语法
当前位置 寻址操作 运算符 功能函数
当前位置
当我们使用XSLT处理XML源文档是 我们用Context来表示当前正在被模板处理的节点位置 比如xsl:template match= / 语句中表示Context在文档的根(root)节点 我不知道如何准确的翻译Context这个词 它类似于C语言里的指针 表示程序当前运行的位置 理解Context对于正确处理XSL模板非常重要 当您的XSL模板输出的文档和您想要的不一样 最先应该分析的就是Context在哪里 Location Paths是用于设定你想要寻找的Context节点位置 就类似DOS的目录命令 我们看个例子
<xsl:for each select= child::PEOPLE/descendant::PERSON >
其中child::PEOPLE/descendant::PERSON就是XPath语法 这个表达式就是一个Location Paths 代码说明要显示所有PEOPLE元素的子元素和所有PERSON元素的子元素 通常我们会采用更简单的写法
<xsl:for each select= PEOPLE//PERSON >
我们来解释path的两种表示方法 / 和 // / 是表示当前文档的节点 类似DOS目录分割符 例如 /PEOPLE表示选择根节点下的PEOPLE元素 PEOPLE/PERSON表示选择PEOPLE元素下所有的PESON子元素 // 则表示当前文档所有的节点 类似查看整个目录 例如 //PEOPLE表示选择文档中所有的PEOPLE元素 无论它在什么层次 PEOPLE//PERSON表示在PEOPLE元素下所有的PERSON元素 无论它的层次多深
寻址操作
Axis和Predicate是XPath语法中对Location Paths进行定位操作的语法 具体的用法列表如下
Axis语法表 表达式 简写 说明 self 选择当前的节点 例子 : <TD><xsl:value of select= /></TD> 代码表示在当前位置插入当前的节点包含的文本(text)值 parent 选择当前节点的父节点 attribute @ 选择一个元素的所有属性 例子: <TD><xsl:value of select= @PERSONID /></TD> 选择PERSON元素的所有属性 child 选择当前节点的所有子元素 ancestor 选择当前节点的所有父元素(包括父元素的父元素 类推)
Axis帮助我们选择当前节点周围所有的节点 而Predicate则用来定位当前节点内部的元素 表示方法为方括号[]中加表达式 [ Expression ] 具体举例如下:
PERSON[position()= ] 这句代码表示寻找第二个 PERSON 元素
PERSON[starts with(name B )] 这句代码表示寻找所有名称以 B 开头的PERSON元素
运算符
这一节介绍XPath的运算符(Expressions) 列表如下 运算符 说明 and or 就是普通意义的and or = 等于 != 不等于 > >= 大于 大于等于 < <= 小于 小于等于 注意 在XSL文件中 <符号要用< 表示 * div 加减乘除 mod 取模 | 两个节点一起计算
功能函数(Functions)
在XPath里有很多功能函数可以帮助我们精确寻找需要的节点
count()功能 作用 统计计数 返回符合条件的节点的个数 举例 <p><xsl:value of select= count(PERSON[name=tom]) /></p> 说明 代码的用途是显示PERSON元素中姓名属性值为tom有几个
number()功能 作用 将属性的值中的文本转换为数值 举例 <p>The number is: <xsl:value of select= number(book/price) /></p> 说明 代码的用途是显示书的价格
substring() 功能 语法 substring(value start length) 作用 截取字符串 举例 <p><xsl:value of select= substring(name ) /></p> 说明 代码的用途是截取name元素的值 从第一个字母开始显示到第三个
sum()功能 作用 求和 举例 <p>Total Price = <xsl:value of select= sum(//price) /></p> 说明 代码的用途是计算所有价格的和
上面这些功能只是XPath语法中的一部分 还有大量的功能函数没有介绍 而且目前XPath的语法仍然在不断发展中 通过这些函数我们可以实现更加复杂的查询和操作
lishixinzhi/Article/program/ASP/201311/21862
XML——XPATH语法介绍
为什么需要xpath?
在使用dom4j的时候,我们不能跨层获取某一个元素,必须一层一层去获取,这就非常麻烦。
所以为了我们更方便地访问某个节点,我们可以使用xpath技术,它可以让我们非常方便地读取到指定节点。
xpath通常结合dom4j配合使用,而且如果要使用xpath,则需要引入一个新的包jaxen-1.1-beta-6.jar
xpath的基础语法有以下几点:
1.基本的xpath语法类似于在一个文件系统中定位文件,如果路径以斜线/
开始,那么该路径就表示到一个元素的绝对路径.
(1)/AAA
,它表示选择根元素AAA
<AAA>这里
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
<DDD/>
<CCC/>
<AAA/>这里
(2)/AAA/CCC
,表示选择AAA的所有CCC子元素
<AAA>
<BBB/>
<CCC/>这里
<BBB/>
<BBB/>
<DDD>
<BBB/>
<DDD/>
<CCC/>这里
<AAA/>
(3)/AAA/DDD/BBB
,表示选择AAA的子元素DDD的所有BBB子元素
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>这里
<DDD/>
<CCC/>
<AAA/>
那么怎么在dom4j中运用xpath呢?其实很简单:
//1.得到SAXReader解析器
SAXReader saxReader = new SAXReader();
//2.指定去解析哪个文件
Document document = saxReader.read(new File(path));
//3.可以使用xpath随心读取
// document.selectNodes(args)返回多个元素
// document.selectSingleNode(args)返回单个元素
List nodes = document.selectNodes("/AAA/BBB");
通过dom4j得到document对象后,可以使用document的selectNodes(args)
方法,这个方法会根据你写的xpath路径返回一个List
,余下的操作就和dom4j类似了。
同时它也有一个selectSingleNode(args)
方法,用于返回一个单个的Node。
下面继续介绍其他的xpath语法:
2.如果路径以双斜线//
开头,则表示文档中所有满足双斜线//
之后规则的元素(无论层级关系)
(1)//BBB
,它表示选择所有BBB元素
<AAA>
<BBB/>这里
<CCC/>
<BBB/>这里
<DDD>
<BBB/>这里
</DDD>
<CCC>
<DDD>
<BBB/>这里
<BBB/>这里
</DDD>
</CCC>
</AAA>
(2)//DDD/BBB
,表示所有父元素是DDD的BBB元素
<AAA>
<BBB/>
<CCC/>
<BBB/>
<DDD>
<BBB/>这里
</DDD>
<CCC>
<DDD>
<BBB/>这里
<BBB/>这里
</DDD>
</CCC>
</AAA>
3.星号*
表示选择所有由星号之前路径所定位的元素
(1)/AAA/CCC/DDD/*
,它表示选择所有路径依附于/AAA/CCC/DDD的元素:
<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>这里
<BBB/>这里
<EEE/>这里
<FFF/>这里
</DDD>
</CCC>
<CCC>
<BBB>
<BBB>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
(2)/*/*/*/BBB
,它表示所有的有3个祖先元素的BBB元素
<AAA>
<XXX>
<DDD>
<BBB/>这里
<BBB/>这里
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>这里
<BBB/>这里
<EEE/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB>这里
<BBB>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
(3)//*
,它表示选择所有的元素
4.方括号里的表达式可以进一步地指定元素,其中数字表示元素在选择集里的位置,而last()函数则表示选择集中的最后一个元素。特别要注意的是这里的下标是从1开始的,而不是0!
(1)/AAA/BBB[1]
,它表示选择AAA的第一个BBB子元素
<AAA>
<BBB/>这个
<BBB/>
<BBB/>
<BBB/>
</AAA>
(2)/AAA/BBB[last()]
,表示选择AAA的最后一个BBB元素
<AAA>
<BBB/>
<BBB/>
<BBB/>
<BBB/>这个
</AAA>
5.对属性的操作
(1)//@id
,选择所有的id属性,注意:是把所有的id属性当做节点返回,而不是返回有id属性的节点。
<AAA>
<BBB id="b1"/>返回这里的id属性节点
<BBB id="b2"/>也返回这里的id属性节点
<BBB name="bbb"/>
<BBB/>
</AAA>
(2)//BBB[@id]
,选择所有有id属性的BBB节点
<AAA>
<BBB id="b1"/>返回这个BBB节点
<BBB id="b2"/>也返回这个BBB节点
<BBB name="bbb"/>
<BBB/>
</AAA>
(3)//BBB[@name]
,选择所有有name属性的BBB节点
<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>返回这个BBB节点
<BBB/>
</AAA>
(4)//BBB[@*]
,选择所有有属性的BBB节点
<AAA>
<BBB id="b1"/>返回这个BBB节点
<BBB id="b2"/>返回这个BBB节点
<BBB name="bbb"/>返回这个BBB节点
<BBB/>
</AAA>
(5)//BBB[not(@*)]
,选择所有没有属性的BBB节点
<AAA>
<BBB id="b1"/>
<BBB id="b2"/>
<BBB name="bbb"/>
<BBB/>这个
</AAA>
6.属性的值可以被用来作为选择的准则
(1)//BBB[@id=‘b1‘]
,选择含有属性id且其值为’b1’的BBB元素
<AAA>
<BBB id="b1"/>这个
<BBB name="bbb"/>
<BBB name="bbb"/>
</AAA>
7.count()
函数可以计数所选元素的个数
(1)//*[count(BBB)=2]
,选择含有2个BBB子元素的元素
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>返回这个元素
<BBB/>
<BBB/>
</DDD>
<EEE>
<CCC/>
<DDD/>
</EEE>
</AAA>
(2)//*[count(*)=2]
,选择含有2个子元素的元素
<AAA>
<CCC>
<BBB/>
<BBB/>
<BBB/>
</CCC>
<DDD>返回这个元素
<BBB/>
<BBB/>
</DDD>
<EEE>也返回这个元素
<CCC/>
<DDD/>
</EEE>
</AAA>
还有很多其他的语法,包括很多函数的应用,用的不多,这里不做介绍
另外,上述介绍的几点语法可以任意组合,比如下述的xml文档:
<AAA>
<BBB id="b1">
<CCC>
<KKK>k1</KKK>
</CCC>
<CCC>
<KKK>k2</KKK>这个
</CCC>
</BBB>
<BBB id="b2"/>
<BBB name="bbb"/>
</AAA>
假如我们现在要找AAA元素下面的第1个BBB子元素下面的第2CCC子元素的KKK子元素,则xpath路径应该这么写:
/AAA/BBB[1]/CCC[2]/KKK
以上是关于XPath语法的主要内容,如果未能解决你的问题,请参考以下文章