热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javaxml读取孙元素_Java操作XML(7)XPath使用

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

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例子

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

cxx1

Bob1

stars1

85

cxx2

Bob2

stars2

100

1.2、XPath术语

1.2.1、节点

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

节点例子:

(文档节点)cxx1(元素节点)

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[&#64;lang]

选取所有拥有名为lang的属性的firstname元素。

//firstname[&#64;lang&#61;&#39;en&#39;]

选取所有firstname元素&#xff0c;且这些元素拥有值为en的lang属性。

/class/student[marks>80]

选取class元素的所有student元素&#xff0c;且其中的marks元素的值须大于80。

/class/student[marks>80]/lastname

选取class元素中的student元素的所有lastname元素&#xff0c;且其中的marks元素的值须大于80。

1.3.3、选取未知节点

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

通配符描述

*

匹配任何元素节点。

&#64;*

匹配任何属性节点。

node()

匹配任何类型的节点。

实例&#xff1a;

路径表达式结果

/class/*

选取class元素的所有子元素。

//*

选取文档中的所有元素。

//student[&#64;*]

选取所有带有属性的student元素。

1.3.4、选取若干路径

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

实例&#xff1a;

路径表达式结果

//student/firstname | //student/lastname

选取student元素的所有firstname和lastname元素。

//firstname | //lastname

选取文档中的所有firstname和lastname元素。

/class/student/firstname | //lastname

选取属于class元素的student元素的所有firstname元素&#xff0c;以及文档中所有的lastname元素。

1.4、XPath步

步(step)包括&#xff1a;

轴(axis):定义所选节点与当前节点之间的树关系

节点测试(node-test):识别某个轴内部的节点

零个或者更多谓语(predicate):更深入地提炼所选的节点集

步的语法&#xff1a;

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

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

1.4.1、XPath轴

轴名称结果

ancestor

选取当前节点的所有先辈(父、祖父等)。

ancestor-or-self

选取当前节点的所有先辈(父、祖父等)以及当前节点本身。

attribute

选取当前节点的所有属性。

child

选取当前节点的所有子元素。

descendant

选取当前节点的所有后代元素(子、孙等)。

descendant-or-self

选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

following

选取文档中当前节点的结束标签之后的所有节点。

namespace

选取当前节点的所有命名空间节点。

parent

选取当前节点的父节点。

preceding

选取文档中当前节点的开始标签之前的所有节点。

preceding-sibling

选取当前节点之前的所有同级节点。

self

选取当前节点。

实例&#xff1a;

例子结果

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运算符

实例&#xff1a;

运算符描述实例返回值

|

计算两个节点集

//firstname| //lastname

返回所有拥有firstname和lastname元素的节点集

&#43;

加法

6 &#43; 4

10

-

减法

6 - 4

2

*

乘法

6 * 4

24

div

除法

8 div 4

2

&#61;

等于

price&#61;9.80

如果 price 是 9.80&#xff0c;则返回 true&#xff1b;如果 price 是 9.90&#xff0c;则返回 false。

!&#61;

不等于

price!&#61;9.80

如果 price 是 9.90&#xff0c;则返回 true&#xff1b;如果 price 是 9.80&#xff0c;则返回 false。

<

小于

price<9.80

如果 price 是 9.00&#xff0c;则返回 true&#xff1b;如果 price 是 9.90&#xff0c;则返回 false。

<&#61;

小于或等于

price<&#61;9.80

如果 price 是 9.00&#xff0c;则返回 true&#xff1b;如果 price 是 9.90&#xff0c;则返回 false。

>

大于

price>9.80

如果 price 是 9.90&#xff0c;则返回 true&#xff1b;如果 price 是 9.80&#xff0c;则返回 false。

>&#61;

大于或等于

price>&#61;9.80

如果 price 是 9.90&#xff0c;则返回 true&#xff1b;如果 price 是 9.70&#xff0c;则返回 false。

or

price&#61;9.80 or price&#61;9.70

如果 price 是 9.80&#xff0c;则返回 true&#xff1b;如果 price 是 9.50&#xff0c;则返回 false。

and

price>9.00 and price<9.90

如果 price 是 9.80&#xff0c;则返回 true&#xff1b;如果 price 是 8.50&#xff0c;则返回 false。

mod

计算除法的余数

5 mod 2

1

2、Java中使用XPath解析XML

具体例子可参考&#xff1a;

参考&#xff1a;https://www.w3school.com.cn/xpath/index.asp



推荐阅读
author-avatar
chucai
这个家伙很懒,什么也没留下,只留下了这个默认个签!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有