Java操作XML(7)--XPath使用

    XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。本文主要介绍Java中使用Xpath来处理XML,文中所使用到的软件版本:Java 1.8.0_191、JDOM 2.0.6、dom4j 2.1.3、jaxen 1.2.0。

1、XPath简介

        XPath用于在XML文档中通过元素和属性进行导航,它是一个W3C标准。XPath使用路径表达式来选取XML文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

1.1、XML例子

后面的内容使用该例子来进行说明。

<?xml version="1.0" encoding="utf-8" ?>
<class>
    <student rollno="1">
        <firstname lang="en">cxx1</firstname>
        <lastname>Bob1</lastname>
        <nickname>stars1</nickname>
        <marks>85</marks>
    </school>
    <student rollno="2">
        <firstname lang="en">cxx2</firstname>
        <lastname>Bob2</lastname>
        <nickname>stars2</nickname>
        <marks>100</marks>
    </student>
</class>

1.2、XPath术语

1.2.1、节点

在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

节点例子:

<class> (文档节点)
<firstname>cxx1</firstname> (元素节点)
rollno="1" (属性节点)

1.2.2、基本值(或称原子值,Atomic value)

基本值是无父或无子的节点。基本值例子:

cxx1
"1"

1.2.3、项目(Item)

项目是基本值或者节点。

1.2.4、父(Parent)

每个元素以及属性都有一个父。

1.2.5、子(Children)

元素节点可有零个、一个或多个子。

1.2.6、同胞(Sibling)

拥有相同的父的节点

1.2.7、先辈(Ancestor)

某节点的父、父的父,等等。

1.2.8、后代(Descendant)

某个节点的子,子的子,等等。

1.3、XPath语法

XPath使用路径表达式来选取XML文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

1.3.1、选取节点

常用的路径表达式:

表达式描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

实例:

路径表达式结果
class 选取class元素的所有子节点。
/class

选取根元素class。注:假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径!

class/student 选取属于class的子元素的所有student元素。
//student 选取所有student子元素,而不管它们在文档中的位置。
class//student 选择属于class元素的后代的所有student元素,而不管它们位于class之下的什么位置。
//@rollno 选取名为rollno的所有属性。

1.3.2、谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。谓语被嵌在方括号中。

实例:

路径表达式结果
/class/student[1] 选取属于class子元素的第一个student元素。
/class/student[last()] 选取属于class子元素的最后一个student元素。
/class/student[last()-1] 选取属于class子元素的倒数第二个student元素。
/class/student[position()<3] 选取最前面的两个属于class元素的子元素的student元素。
//firstname[@lang] 选取所有拥有名为lang的属性的firstname元素。
//firstname[@lang='en'] 选取所有firstname元素,且这些元素拥有值为en的lang属性。
/class/student[marks>80] 选取class元素的所有student元素,且其中的marks元素的值须大于80。
/class/student[marks>80]/lastname 选取class元素中的student元素的所有lastname元素,且其中的marks元素的值须大于80。

1.3.3、选取未知节点

XPath通配符可用来选取未知的XML元素。

通配符描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例:

路径表达式结果
/class/* 选取class元素的所有子元素。
//* 选取文档中的所有元素。
//student[@*] 选取所有带有属性的student元素。

1.3.4、选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例:

路径表达式结果
//student/firstname | //student/lastname 选取student元素的所有firstname和lastname元素。
//firstname | //lastname 选取文档中的所有firstname和lastname元素。
/class/student/firstname | //lastname 选取属于class元素的student元素的所有firstname元素,以及文档中所有的lastname元素。

1.4、XPath步

步(step)包括:
  轴(axis):定义所选节点与当前节点之间的树关系
  节点测试(node-test):识别某个轴内部的节点
  零个或者更多谓语(predicate):更深入地提炼所选的节点集

步的语法:

轴名称::节点测试[谓语]

XPath的位置路径均包括一个或多个步,每个步均被斜杠分割。

1.4.1、XPath轴

轴名称结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

实例:

例子结果
child::student 选取所有属于当前节点的子元素的student节点。
attribute::rollno 选取当前节点的rollno属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::student 选取当前节点的所有student后代。
ancestor::student 选择当前节点的所有student先辈。
ancestor-or-self::student 选取当前节点的所有student先辈以及当前节点(如果此节点是student节点)
child::*/child::firstname 选取当前节点的所有firstname孙节点。

1.5、XPath运算符

实例:

运算符描述实例返回值
| 计算两个节点集 //firstname| //lastname 返回所有拥有firstname和lastname元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80

如果 price 是 9.80,则返回 true;如果 price 是 9.90,则返回 false。

!= 不等于 price!=9.80

如果 price 是 9.90,则返回 true;如果 price 是 9.80,则返回 false。

< 小于 price<9.80

如果 price 是 9.00,则返回 true;如果 price 是 9.90,则返回 false。

<= 小于或等于 price<=9.80

如果 price 是 9.00,则返回 true;如果 price 是 9.90,则返回 false。

> 大于 price>9.80

如果 price 是 9.90,则返回 true;如果 price 是 9.80,则返回 false。

>= 大于或等于 price>=9.80

如果 price 是 9.90,则返回 true;如果 price 是 9.70,则返回 false。

or price=9.80 or price=9.70

如果 price 是 9.80,则返回 true;如果 price 是 9.50,则返回 false。

and price>9.00 and price<9.90

如果 price 是 9.80,则返回 true;如果 price 是 8.50,则返回 false。

mod 计算除法的余数 5 mod 2 1

2、Java中使用XPath解析XML

具体例子可参考:

Java操作XML(1)--DOM方式处理XML

Java操作XML(5)--使用JDOM处理XML

Java操作XML(6)--使用dom4j处理XML

参考:https://www.w3school.com.cn/xpath/index.asp

原文地址:https://www.cnblogs.com/wuyongyin/p/14279040.html