【高级编程】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…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...