【高级编程】XML DOM4J解析XML文件(含案例)
文章目录
- DOM4J
- DOM4J 解析 XML
- 读取
- 修改
- 添加
- 删除
XML(EXtensible Markup Language),可扩展标记语言。一种用于存储和传输数据的标记语言。XML 与操作系统、编程语言的开发平台无关。实现不同系统之间的数据交换。
作用:数据交互;配置应用程序和网站;Ajax基石
<!-- 声明 -->
<?xml version="1.0" encoding="UTF-8"?>
<books><!-- 文档元素描述信息(文档结构) --><!-- 图书信息 --><book id="bk101"><author>王珊</author><title>.NET高级编程</title><description>包含C#框架和网络编程等</description></book><book id="bk102"><author>李明明</author><title>XML基础编程</title><description>包含XML基础概念和基本作用</description></book>
</books>
XML 文档内容由一系列标签元素组成
<元素名 属性名 = "属性值">元素内容</元素名>
-
属性值用双引号包裹
-
一个元素可以有多个属性
-
属性值中不能直接包含:
< " & -
不建议使用的字符:
' >
<!-- 空元素 -->
<name> </name>
<name></name>
<name/>
XML 编写注意事项
-
所有XML 元素都必须有结束标签
-
XML 标签对大小写敏感
-
XML 必须正确的嵌套
-
同级标签以缩进对齐
-
元素名称可以包含字母、数字或其他的字符
-
元素名称不能以数字或者标点符号开始
-
元素名称中不能含空格
属性命名空间
<?xml version="1.0" encoding="UTF-8"?>
<batchCompany xmlns="http://www.Aptech_edu.ac"xmlns:tea="http://www.tea.org"><batch-list><batch type="thirdbatch">第三批次</batch><batch tea:type="thirdbatch">第三批次</batch><batch>午班批次</batch></batch-list>
</batchCompany>
除非带有前缀,否则属性属于所属的元素的命名空间
DOM
文档对象模型 ( Document Object Model ) 。DOM 把 XML 文档映射成一个倒挂的树。
DOM解析包:org.w3c.dom
| 常用接口 | 常用方法 | 说明 |
|---|---|---|
| Document:表示整个 XML 文档 | NodeList getElementsByTagName(String Tag) | 按文档顺序返回文档中指定标记名称的所有元素集合 |
| Element createElement(String tagName) | 创建指定标记名称的元素 | |
| Node:该文档树中的单个节点 | NodeList getChildNodes() | 获取该元素的所有子节点,返回节点集合 |
| Element:XML 文档中的一个元素 | String getTagName() | 获取元素名称 |
DOM4J
DOM4J(Document Object Model for XML in Java)是一个简单、轻量级的Java库,用于处理XML文档。它提供了一种方式来读取、修改和写入XML文件。
在 DOM4J 中,这些类是构成XML文档的基本组成部分,它们共同构成了DOM4J的核心模型:
Document类:代表整个XML文档。每个 XML 文档的根元素就是Document对象的子对象Element类:代表XML文档中的元素节点。每个Element都有名称,可以有子元素、文本内容及属性Text类:表示XML文档中的文本节点。Text节点可以包含在Element中Attribute类:代表元素上的属性。在<element attr="value">中,attr是属性名,“value”` 是该属性的值
DOM4J 解析 XML
| 方法 | 描述 | 举例 |
|---|---|---|
| SAXReader() | 读取 xml 文件 | // 将 xml 文件加载到内存中 XML 解析器 SAXReader saxReader = new SAXReader(); // document 加载执行 xml 文档获取 Document 对象 Document document = saxReader.read(XML路径); |
| getRootElement() | 获取 XML 根节点 | Element rootElement = document.getRootElement(); |
| elements() | 获取当前节点下所有子节点 | // 获取根节点下所有子节点 List<Element> Elist = rootElement.elements(); |
| elements(“节点名”) | 根据指定子元素名,获取元素下所有子节点 | // 获取节点名称为books下所有子节点 List<Element> Elist = rootElement.elements(“books”); |
| element(“节点名”) | 根据指定子元素名,获取子元素对象,如果重复,则获取第一个 | //获取节点名称为books下单个子节点 Element element= rootElement.element(“books”); |
| setText() | 设置元素文本内容 | newelement.setText(“内容”); |
| getText() | 获取当前节点文本内容 | element.getText() |
| elementText(“节点名”) | 根据指定子元素名,获取元素中的文本 | e.elementText(“book”) |
| attributeValue(“属性名”) | 获取当前节点属性 | e.attributeValue(“name”) |
| addElement(“节点名”) | 创建节点Element对象 | Element newelement = rootElement.addElement(“span”); |
| addAttribute(“节点属性名”,“属性值”) | 节点添加,修改属性Element对象 | newelement.addAttribute(“type”,“属性值”); |
| creatDocument() | 新XML添加Documen对象 | // 创建一个Document对象 Document read = DocumentHelper.createDocument(); |
| createPrettyPrint() | 设置XML编码 | // 创建OutputFormat对象,并设置编码集 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding(“UTF-8”); |
| write() | 写入XML文件 | //写入XML文件的位置 以及指定的格式 XMLWriter xmlWriter=new XMLWriter(new FileWriter(“cs.xml”),outputFormat); //开始写入XML文件 写入Document对象 xmlWriter.write(document); xmlWriter.close(); |
我们有两个 XML 文件
【students.xml】
<?xml version="1.0" encoding="UTF-8"?>
<stus><stu id="1001"><name>张三</name><age>21</age><score value="80"/></stu><stu id="1002"><name>李四</name><age>19</age><score value="92"/></stu>
</stus>
【books.xml】
<?xml version="1.0" encoding="UTF-8"?>
<books><!--图书信息 --><book id="bk101"><author>王珊</author><title>.NET高级编程</title><description>包含C#框架和网络编程等</description></book><book id="bk102"><author>李明明</author><title>XML基础编程</title><description>包含XML基础概念和基本作用</description></book>
</books>
首先定义类,在 UtilsXml 类中编写公用方法
public class UtilsXml {static Document document = null;// 读取文档(用于 读取 修改 删除方法)public static void info(String path){try {//构建解析器SAXReader saxReader = new SAXReader();//通过read方法获得doc对象document = saxReader.read(path);} catch (DocumentException e) {throw new RuntimeException(e);}} // 写入文件(用于 修改 添加 删除方法)public static void OutputXml(String path){try {//document 写入XMLWriter xmlWriter = new XMLWriter(new FileWriter(path));xmlWriter.write(document);xmlWriter.close();} catch (IOException e) {throw new RuntimeException(e);}}
}
接下来分别定义读取、修改、添加、删除 XML 的静态方法
读取
public static void showXml(){try {info("ch10/students.xml");//获得根节点Element root = document.getRootElement();//打印根节点名称System.out.println("根节点:"+root.getName());//获得所有子节点List<Element> elements = root.elements();for(Element element : elements){System.out.println("---------stu--------");//获得每个子节点上的id属性值String id = element.attributeValue("id");System.out.println("id:"+id);//获得stu下name元素节点Element name = element.element("name");System.out.println("name:"+name.getText());Element age = element.element("age");System.out.println("age:"+age.getText());Element score = element.element("score");System.out.println("score:"+score.attributeValue("value"));}} catch (Exception e) {e.printStackTrace();}
}
修改
public static void editXml(){try {info("ch10/students.xml");//获得根节点Element root = document.getRootElement();List<Element> elementList = root.elements();for(Element element:elementList){if("1002".equals(element.attributeValue("id"))){element.element("name").setText("王五");}}//新增节点Element stu = root.addElement("stu");stu.addAttribute("id","1003");stu.addElement("name").setText("马六");stu.addElement("age").setText("20");stu.addElement("score").addAttribute("value","77");//document 写入students.xmlOutputXml("ch10/students.xml");} catch (Exception e) {e.printStackTrace();}
}
添加
public static void saveXml(){try {document = DocumentHelper.createDocument();// 添加 root 节点 根节点Element books = document.addElement("books");Element book1 = books.addElement("book");book1.addAttribute("id","bk101");book1.addElement("author").setText("王珊");book1.addElement("title").setText(".NET高级编程");Element book2 = books.addElement("book");book2.addAttribute("id","bk102");book2.addElement("author").setText("王明明");book2.addElement("title").setText("XML基础编程");OutputXml("ch10/books.xml");} catch (Exception e) {e.printStackTrace();}
}
删除
public static void deleteXml(){try {info("ch10/books.xml");Element root = document.getRootElement(); // 获得根节点List<Element> elementList = root.elements();for(Element element:elementList){Element author = element.element("author");if(author.getText().equals("王明明")){element.getParent().remove(element);}}OutputXml("ch10/books.xml");} catch (Exception e) {throw new RuntimeException(e);}
}
在 main() 方法中依次调用上述方法
public class UtilsXml {public static void main(String[] args) {//showXml(); //读取//editXml(); //修改//saveXml(); //添加deleteXml(); //删除}
}
相关文章:
【高级编程】XML DOM4J解析XML文件(含案例)
文章目录 DOM4JDOM4J 解析 XML读取修改添加删除 XML(EXtensible Markup Language),可扩展标记语言。一种用于存储和传输数据的标记语言。XML 与操作系统、编程语言的开发平台无关。实现不同系统之间的数据交换。 作用:数据交互&a…...
查看VSFTPD配置的服务器路径和linux系统有哪些用户
要查看VSFTPD (Very Secure FTP Daemon)配置中定义的服务器路径,需要检查VSFTPD的配置文件。这通常可以在配置文件中找到并有不同的选项来设置路径。 这里有几个方法可以查看配置的服务器路径: 1. 检查主配置文件 VSFTPD的默认配置文件通常位于`/etc/vsftpd.conf`。可以使用…...
JavaEE: 创造无限连接——网络编程中的套接字
文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制࿰…...
记K8s组件harbor和kuboard故障恢复
#记录一次工作实践# 故障现象: 本地私有仓库harbor和控制台kuboard均无法正常登陆。 解决过程: 1、harbor恢复过程 通过docker ps -a |grep harbor查看harbor相关的容器状态,发现均显示启动状态,但是仓库无法访问。 通过doc…...
c++ return {};
https://segmentfault.com/q/1010000042734336 return {}; 表示“返回一个用空 列表初始化器 初始化的函数返回类型的对象”。确切的行为取决于返回对象的类型。 std::string get_string() {return {}; // an empty string is returned }...
【设计模式-适配】
Adapter Pattern(适配器模式) 是一种结构型设计模式,其主要目的是让不兼容的接口能够协同工作。适配器模式通过引入一个适配器类,转换一个类的接口,使得原本不兼容的接口可以互相配合,从而实现接口的兼容性…...
深度学习02-pytorch-08-自动微分模块
其实自动微分模块,就是求相当于机器学习中的线性回归损失函数的导数。就是求梯度。 反向传播的目的: 更新参数, 所以会使用到自动微分模块。 神经网络传输的数据都是 float32 类型。 案例1: 代码功能概述: 该…...
使用Python实现深度学习模型:智能宠物监控与管理
在现代家庭中,宠物已经成为许多家庭的重要成员。为了更好地照顾宠物,智能宠物监控与管理系统应运而生。本文将详细介绍如何使用Python实现一个智能宠物监控与管理系统,并结合深度学习模型来提升其功能。 一、准备工作 在开始之前,我们需要准备以下工具和材料: Python环境…...
【HTTPS】对称加密和非对称加密
HTTPS 是什么 HTTPS 是在 HTTP 的基础上,引入了一个加密层(SSL)。HTTP 是明文传输的(不安全) 当下所见到的大部分网站都是 HTTPS 的,这都是拜“运营商劫持”所赐 运营商劫持 下载⼀个“天天动听“&…...
MySQL中的LIMIT与ORDER BY关键字详解
前言 众所周知,LIMIT和ORDER BY在数据库中,是两个非常关键并且经常一起使用的SQL语句部分,它们在数据处理和分页展示方面发挥着重要作用。 今天就结合工作中遇到的实际问题,回顾一下这块的知识点。同时希望这篇文章可以帮助到正…...
Java 编码系列:集合框架(List、Set、Map 及其常用实现类)
引言 在 Java 开发中,集合框架是不可或缺的一部分,它提供了存储和操作一组对象的工具。Java 集合框架主要包括 List、Set 和 Map 接口及其常用的实现类。正确理解和使用这些集合类不仅可以提高代码的可读性和性能,还能避免一些常见的错误。本…...
Go进阶概览 -【7.2 泛型的使用与实现分析】
7.2 泛型的使用与实现分析 泛型是Go 1.18引入的概念,在引入这个概念前经过了好几年的考量最终才将这这个特性加进去。 泛型在多种语言中都是存在的,比如C、Java等语言中都有泛型的概念。 本节我们将针对泛型的使用、实现原理进行整体的讲解。 本节代…...
罗德岛战记游戏源码(客户端+服务端+数据库+全套源码)游戏大小9.41G
罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 下载地址: 通过网盘分享的文件:【源码】罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 链接: https://pan.baidu.com/s/1y0…...
AI+教育|拥抱AI智能科技,让课堂更生动高效
AI在教育领域的应用正逐渐成为现实,提供互动性强的学习体验,正在改变传统教育模式。AI不仅改变了传统的教学模式,还为教育提供了更多的可能性和解决方案。从个性化学习体验到自动化管理任务,AI正在全方位提升教育质量和效率。随着…...
WebServer
一、服务器代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <unistd.h> #define PORT 80 #define BUFFER_SIZE 1024 void ha…...
java项目之基于spring boot的多维分类的知识管理系统的设计与实现源码
项目简介 基于spring boot的多维分类的知识管理系统的设计与实现实现了以下功能: 基于spring boot的多维分类的知识管理系统的设计与实现的主要使用者管理员可以管理用户信息,知识分类,知识信息等,用户可以查看和下载管理员发布…...
go的结构体、方法、接口
结构体: 结构体:不同类型数据集合 结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段” 先声明一下我们的结构体: type Person struct {name stringage intsex string } 定义结构体法1: var p1 P…...
力扣第一题——删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1)额外空间的条件下完成。 示例 1&#x…...
Tuxera NTFS for Mac 2023绿色版
在数字化时代,数据的存储和传输变得至关重要。Mac用户经常需要在Windows NTFS格式的移动硬盘上进行读写操作,然而,由于MacOS系统默认不支持NTFS的写操作,这就需要我们寻找一款高效的读写软件。Tuxera NTFS for Mac 2023便是其中…...
LeetCode[中等] 155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
