(三)XML基础(3):Xpath
五、XPath:快速定位到节点
5.1 简介
5.2 语法
5.3 案例
- XPath对有命名空间的xml文件和没有命名空间的xml定位节点的方法是不一样的,所以再对不同的xml需要进行不同的处理。
- 使用前提: 导入
- Test_Xpath.java
package dom; import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class Test_Xpath { public static void main(String[] args) {
// Test_Xpath.testNo_Namespace();
Test_Xpath.test_Namespace(); } /**
* 搜索有命名空间的xml文件
*/
private static void test_Namespace() { File xmlFile=new File("./src/student.xml");
SAXReader saxReader=new SAXReader();
Map<String,String> namespaceURIs=new HashMap<String, String>(); /**
* 设置命名空间,注意在xml文件中命名空间的前缀可以为空(xmlns="http://www.example.org/student")
* 但是在这里不能为空,必须有前缀
*/
namespaceURIs.put("stu", "http://www.example.org/student");
namespaceURIs.put("jdbc","http://www.example.org/jdbc");
saxReader.getDocumentFactory().setXPathNamespaceURIs(namespaceURIs);
try {
Document document=saxReader.read(xmlFile); Element rootElment=document.getRootElement();
Element parentElement=rootElment.element("root"); /**
* 从document节点开始搜索——绝对路径 "/other/root/student"
* 中以/打头表示以绝对路径方法,而这个xml文件里的根节点为other,
* 这里的other、root、student节点都是stu命名空间的xml文件里的,所以要加stu前缀
*/
List<Element> list = document.selectNodes("/stu:other/stu:root/stu:student");
// System.out.println(list.size()); /**
* 从other路径搜索——相对路径
*/
list = rootElment.selectNodes("stu:root/stu:student");
// System.out.println(list.size()); /**
* 从root目录(parentElement节点)搜索起_全文路径,
* 这里的parentElemen换成其他节点比如document或者rootElement也是可以的,
* 只要这个节点是被搜索节点的父节点即可
*/
list = parentElement.selectNodes("//stu:student");
// System.out.println(list.size()); /**
* 找到属性id=03的节点
*/
list = parentElement.selectNodes("/stu:other/stu:root/stu:student[@id=03]");
Element element_id03 = list.get(0);
// System.out.println(element_id03.element("name").getText()); /**
* 查找性别为男的节点,没有加@的就是指元素节点的值,加了@是指节点的属性的值
* 属性不用加前缀外,元素节点必须加前缀
*/
list = parentElement.selectNodes("stu:student[stu:sex='男']");
// System.out.println(list.size()); /**
* 查找年龄在某一范围的节点
*/
list = parentElement.selectNodes("stu:student[stu:age>=15 and stu:age<50]");
// System.out.println(list.size()); /**
* 查找名称中有a字符的节点,相当于sql中的模糊查询(like),
* xpath中也有函数,这里的contains(name,'张三') 就是一个函数,
* student[contains(name,'张三')] :
* 表示查找子节点为name且name的值含有‘张三’的student节点
*/
list = parentElement.selectNodes("stu:student[contains(stu:name,'张三')]");
// System.out.println(list.size()); /**
* 查找名称为包含a的字符,并且性别为男的,并且年龄在一个范围内
*/
list = parentElement.selectNodes("stu:student[contains(stu:name,'张三') and stu:sex='男' and stu:age>=10 ]");
// System.out.println(list.size()); Element jdbcElement=(Element)document.selectSingleNode("/stu:other/jdbc:jdbcInfo"); System.out.println(jdbcElement.elementText("jdbcDriver"));
System.out.println(jdbcElement.elementText("url"));
System.out.println(jdbcElement.elementText("password"));
System.out.println(jdbcElement.elementText("user")); } catch (DocumentException e) {
e.printStackTrace();
} } /**
* 搜索没有命名空间的xml文件
*/
private static void testNo_Namespace() {
File xmlFile = new File("./src/no_namespace.xml"); SAXReader saxReader = new SAXReader(); try {
Document document = saxReader.read(xmlFile); Element rootElment = document.getRootElement(); Element parentElement = (Element) rootElment.elements("root").get(0); /**
* 从document节点开始搜索——绝对路径 "/other/root/student"
* 中以/打头表示以绝对路径方法,而这个xml文件里的根节点为other
*/
List<Element> list = document.selectNodes("/other/root/student");
// System.out.println(list.size()); /**
* 从other路径搜索——相对路径
*/
list = rootElment.selectNodes("root/student");
// System.out.println(list.size()); /**
* 从root目录(parentElement节点)搜索起_全文路径,
* 这里的parentElemen换成其他节点比如document或者rootElement也是可以的,
* 只要这个节点是被搜索节点的父节点即可
*/
list = parentElement.selectNodes("//student");
// System.out.println(list.size()); /**
* 找到属性id=03的节点
*/
list = parentElement.selectNodes("/other/root/student[@id=03]");
Element element_id03 = list.get(0);
// System.out.println(element_id03.element("name").getText()); /**
* 查找性别为男的节点,没有加@的就是指元素节点的值,加了@是指节点的属性的值
*/
list = parentElement.selectNodes("student[sex='男']");
// System.out.println(list.size()); /**
* 查找年龄在某一范围的节点
*/
list = parentElement.selectNodes("student[age>=15 and age<50]");
// System.out.println(list.size()); /**
* 查找名称中有a字符的节点,相当于sql中的模糊查询(like),
* xpath中也有函数,这里的contains(name,'张三') 就是一个函数,
* student[contains(name,'张三')] :
* 表示查找子节点为name且name的值含有‘张三’的student节点
*/
list = parentElement.selectNodes("student[contains(name,'张三')]");
// System.out.println(list.size()); /**
* 查找名称为包含a的字符,并且性别为男的,并且年龄在一个范围内
*/
list = parentElement.selectNodes("student[contains(name,'张三') and sex='男' and age>=10 ]");
System.out.println(list.size()); } catch (DocumentException e) {
e.printStackTrace();
} }
}
- student.xml
<?xml version="1.0" encoding="UTF-8"?> <other xmlns="http://www.example.org/student" xmlns:jdbc="http://www.example.org/jdbc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/student student.xsd http://www.example.org/jdbc jdbc.xsd ">
<root>
<student id="01">
<name>张三</name>
<age>15</age>
<sex>男</sex>
<content>张三备注</content>
</student>
<student id="02">
<name>被修改后的张三</name>
<age>25</age>
<sex>女</sex>
<content>李四备注</content>
</student>
<student id="03">
<name>新增</name>
<age>12</age>
<sex>男</sex>
<content><![CDATA[#$%^#$%#$^]]></content>
</student>
</root>
<jdbc:jdbcInfo>
<jdbc:jdbcDriver>com.mysql.jdbc.Driver</jdbc:jdbcDriver>
<jdbc:url>jdbc:mysql://127.0.0.1:3306/user?useUnicode=true&characterEncoding=UTF-8</jdbc:url>
<jdbc:user>root</jdbc:user>
<jdbc:password></jdbc:password>
</jdbc:jdbcInfo>
</other>
- no_namespace.xml
<?xml version="1.0" encoding="UTF-8"?> <other >
<root>
<student id="01">
<name>张三</name>
<age>15</age>
<sex>男</sex>
<content>张三备注</content>
</student>
<student id="02">
<name>被修改后的张三</name>
<age>25</age>
<sex>女</sex>
<content>李四备注</content>
</student>
<student id="03">
<name>新增</name>
<age>12</age>
<sex>男</sex>
<content><![CDATA[#$%^#$%#$^]]></content>
</student> </root>
</other>
(三)XML基础(3):Xpath的更多相关文章
- XML 参考:XML基础 XML 简介
XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...
- XML基础+Java解析XML +几种解析方式的性能比较
XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...
- XML基础介绍【二】
XML基础介绍[二] 1.schema约束dtd语法: <!ELEMENT 元素名称 约束>schema符合xml的语法,xml语句.一个xml中可以有多个schema,多个schema使 ...
- .net学习笔记---xml基础知识
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- XML基础概念
XML基础概念 一.什么是XML. 可扩展标记语言(EXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 二.XML特点 1 ...
- 转载---SQL Server XML基础学习之<5>--XQuery(query)
本章写一些SQL Server XML的一些XQuery基础语法,主要讲的query查询语法 T-SQL 支持用于查询 XML 数据类型的 XQuery 语言的子集. XQuery 基于现有的 XPa ...
- XML基础<第一篇>
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
- 【二十八】xml编程(dom\xpath\simplexml)
1.xml基础概念 作用范围: 作为程序通讯的标准. 作为配置文件. 作为小型数据库. xml语法: <根标签> <标签 元素="元素值" ...>< ...
- 第一篇 -- XML基础
一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...
随机推荐
- Qt之模型/视图(自定义风格)
Qt之模型/视图(自定义风格) 关于自定义风格是针对视图与委托而言的,使用事件与QSS都可以进行处理,今天关于美化的细节讲解一下. 先看下图: 先撇开界面的美观性(萝卜青菜,各有所爱),就现有的这些风 ...
- 基于python的人脸识别(检测人脸、眼睛、嘴巴、鼻子......)
本文链接:https://blog.csdn.net/James_Ray_Murphy/article/details/79209172 import numpy as np import cv2 # ...
- jquery页面滚动到指定id
//jquery页面滚动到指定id $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html ...
- Android插件化技术——原理篇
<Android插件化技术——原理篇> 转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...
- Map接口和Collection接口的区别
* Map是双列的,Collection是单列的 * Map的键唯一,Collection的子体系Set是唯一的 * Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针 ...
- 发布一个史上最简单代码最少Javascript Timer,解决一切定时执行的问题
这个函数实现如下 function TimerStart(func,delay) { var TimerID = window.setInterval( function() { if(!func() ...
- VM12_pro+Ubuntu16_64+Qt5.12.2环境搭建
1.准备软件[已经存网盘] 2.安装Vm 3.安装Ubuntu 4.进入linux,修改Qt安装包权限 5.运行Qt 6.第五步会弹出Qt安装的界面,默认安装就行了 7.修改环境变量 sudo ged ...
- Qt编写数据导出到Excel及Pdf和打印数据
一.前言 用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询 ...
- 123467123456#1#-----com.twoapp.DaDiShuGame01--前拼后广--现实打地鼠游戏jiemei
com.twoapp.DaDiShuGame01--前拼后广--现实打地鼠游戏jiemei
- Docker 容器的运行(八)
目录 一.运行容器 1.运行第一个容器 2.让容器长期运行 二.进入容器 1.attach 2.exec 3.attach VS exec 4.容器内部都在干些什么 三.停止/启动/重启容器 四.暂停 ...