Java Web(六)--XML
介绍
官网:XML 教程
为什么需要:
- 需求 1 : 两个程序间进行数据通信?
- 需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码。
- spring 中的 ico 配置文件,beans.xml 、mybatis XXXMapper.xml 、 tomcat server.xml web.xml 、maven pom.xml
- 能存储复杂的数据关系
解决问题:
- 1)解决程序间数据传输的问题:=> json
- 比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
- 2)xml 可以做配置文件
- xml 文件做配置文件可以说非常的普遍
- 比如我们的 tomcat 服务器的server.xml ,web.xml
- 3)xml 可以充当小型的数据库
- 程序自己的数据格式存放
- 直接读取文件显然要比读取数据库快
- 程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作)
xml
创建
File -> New ->Project ->java ->New Project ->New ->File ->文件名.xml
组成
1、文档声明
<?xml version="1.0" encoding="utf-8"?>
说明
- 1、XML 声明放在 XML 文档的第一行
- 2、XML 声明由以下几个部分组成:
- version - -文档符合XML1.0 规范,我们学习 1.0
- encoding - -文档字符编码,比如"utf-8"
2、元素
语法: 每个XML文档必须有且只有一个根元素。
根元素
- 是一个完全包括文档中其他所有元素的元素
- 起始标记要放在所有其他元素的起始标记之前
- 结束标记要放在所有其他元素的结束标记之后
XML 元素/标签/节点
- 指XML 文件中出现的标签
- 一个标签分为开始标签和结束标签
- 一个标签中也可以嵌套若干子标签。
- 但所有标签必须合理的嵌套,绝对不允许交叉嵌
书写形式
- 包含标签体:<a>www.sohu.cn</a>
- 不含标签体的:<a></a>, 简写为:<a/>
命名规则
- 区分大小写;例如,<P>和<p>是两个不同的标记
- 不能以数字开头。
- 不能包含空格。
- 名称中间不能包含冒号(:)
- 如果标签单词需要间隔,建议使用下划线; 比如 <book_title>hello</book_title>
3、属性
基本格式: <元素名 属性名="属性值">
说明
- 属性值用双引号(")或单引号(')分隔;如果属性值中有',用"分隔;有",用'分隔。
- 一个元素可以有多个属性。
- 特定的属性名称在同一个元素标记中只能出现一次。
- 属性值不能包括& 字符。
<Student ID="100"><Name>TOM</Name></Student>
4、注释
语法格式: <!--这是一个注释- ->
说明
- 注释内容中不要出现- -;
- 不要把注释放在标记中间;错误写法 <Name <!--the name-->>TOM</Name>。
- 注释不能嵌套;
- 可以在除标记以外的任何地方放注释
5、CDATA 区 、特殊字符
语法
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
说明:
- 可以输入任意字符(除]]>外)
- 不能嵌套
- 有些内容不想让解析引擎执行, 而是当作原始内容处理(即当做普通文本), 可以使用 CDATA 包括起来, CDATA 节中的所有字符都会被当作简单文本, 而不是 XML 标记
实例1:
<?xml version="1.0" encoding="utf-8"?><students> <student id="01"> <name>小龙女</name> <gender>女</gender> <age>19</age> <resume>古墓派掌门人</resume> </student> <student id="02"> <name>欧阳锋</name> <gender>男</gender> <age>21</age> <resume>白驼山,蛤蟆神功</resume> </student>
</students>
DOM4j
介绍
官网:dom4j 1.6.1 API
一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。
使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比 JDOM 更好的灵活性
一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。
使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件。

注意:xml常用来查询(遍历和指定查询),删改使用少,作为扩展。
获取document对象的3种方式
1、读取 XML 文件,获得 document 对象
//创建一个解析器SAXReader reader = new SAXReader(); //XML DocumentDocument document = reader.read(new File("src/input.xml"));
2、解析 XML 形式的文本,得到 document 对象.
String text = "<members></members>";Document document = DocumentHelper.parseText(text);
3、主动创建document 对象.
//创建根节点 Document document = DocumentHelper.createDocument();Element root = document.addElement("members");
常用API
attributes 返回该元素的属性列表
attributeValue 根据传入的属性名获取属性值
elementIterator 返回包含子元素的迭代器
elements 返回包含子元素的列表
应用实例

<?xml version="1.0" encoding="utf-8"?><students><student id="01"><name>小龙女</name><gender>女</gender><age>19</age><resume>古墓派掌门人</resume></student><student id="02"><name>欧阳锋</name><gender>男</gender><age>21</age><resume>白驼山,蛤蟆神功</resume></student>
</students>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.testng.annotations.Test;import java.io.File;
import java.io.FileOutputStream;
import java.util.List;public class Dom4j_ {/*** 演示如何加载xml文件*/
@Test
public void loadXML() throws DocumentException {// 得到一个解析器SAXReader reader = new SAXReader();Document document = reader.read(new File("src/students.xml"));System.out.println(document); // org.dom4j.tree.DefaultDocument@887af79}/*** 遍历所有的student信息*/
@Test
public void listStus() throws DocumentException {// 得到一个解析器SAXReader reader = new SAXReader();Document document = reader.read(new File("src/students.xml"));// 1. 得到rootElement, 你是OOPElement rootElement = document.getRootElement();// 2. 得到rootElement的student ElementsList<Element> students = rootElement.elements("student");// System.out.println(student.size());//2for (Element student : students) {// element就是Student元素/节点// 获取Student元素 的name ElementElement name = student.element("name");Element age = student.element("age");Element resume = student.element("resume");Element gender = student.element("gender");System.out.println("学生信息= " + name.getText() + " " + age.getText() +" " + resume.getText() + " " + gender.getText());}}/*** 指定读取第一个学生的信息 就是 dom4j+xpath*/
@Test
public void readOne() throws DocumentException {// 得到一个解析器SAXReader reader = new SAXReader();Document document = reader.read(new File("src/students.xml"));// 1. 得到rootElement, 你是OOPElement rootElement = document.getRootElement();// 2. 获取第一个学生Element student = (Element) rootElement.elements("student").get(1);// 3. 输出该信息System.out.println("该学生的信息= " + student.element("name").getText() + " " +student.element("age").getText() + " " + student.element("resume").getText() +student.element("gender").getText());// 4. 获取student元素的属性System.out.println("id= " + student.attributeValue("id"));
}/*** 加元素(要求: 添加一个学生到xml中) [不要求,使用少,了解]** @throws Exception*/
@Test
public void add() throws Exception {// 1.得到解析器SAXReader saxReader = new SAXReader();// 2.指定解析哪个xml文件Document document = saxReader.read(new File("src/students.xml"));// 首先我们来创建一个学生节点对象Element newStu = DocumentHelper.createElement("student");Element newStu_name = DocumentHelper.createElement("name");// 如何给元素添加属性newStu.addAttribute("id", "04");newStu_name.setText("宋江");// 创建age元素Element newStu_age = DocumentHelper.createElement("age");newStu_age.setText("23");// 创建resume元素Element newStu_intro = DocumentHelper.createElement("resume");newStu_intro.setText("梁山老大");// 把三个子元素(节点)加到 newStu下newStu.add(newStu_name);newStu.add(newStu_age);newStu.add(newStu_intro);// 再把newStu节点加到根元素document.getRootElement().add(newStu);// 直接输出会出现中文乱码:OutputFormat output = OutputFormat.createPrettyPrint();output.setEncoding("utf-8");// 输出的编码utf-8// 把我们的xml文件更新// lets write to a file// new FileOutputStream(new File("src/myClass.xml"))// 使用到io编程 FileOutputStream 就是文件字节输出流XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), output);writer.write(document);writer.close();}/*** //删除元素(要求:删除第一个学生) 使用少,了解** @throws Exception*/
@Test
public void del() throws Exception {// 1.得到解析器SAXReader saxReader = new SAXReader();// 2.指定解析哪个xml文件Document document = saxReader.read(new File("src/students.xml"));// 找到该元素第一个学生Element stu = (Element) document.getRootElement().elements("student").get(2);// 删除元素stu.getParent().remove(stu);// //删除元素的某个属性
// stu.remove(stu.attribute("id"));// 更新xml// 直接输出会出现中文乱码:OutputFormat output = OutputFormat.createPrettyPrint();output.setEncoding("utf-8");// 输出的编码utf-8// 把我们的xml文件更新XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), output);writer.write(document);writer.close();System.out.println("删除成功~");
}/*** //更新元素(要求把所有学生的年龄+3) 使用少,了解** @throws Exception*/
@Test
public void update() throws Exception {// 1.得到解析器SAXReader saxReader = new SAXReader();// 2.指定解析哪个xml文件Document document = saxReader.read(new File("src/students.xml"));// 得到所有学生的年龄List<Element> students = document.getRootElement().elements("student");// 遍历, 所有的学生元素的age+3for (Element student : students) {// 取出年龄Element age = student.element("age");age.setText((Integer.parseInt(age.getText()) + 3) + "");}// 更新// 直接输出会出现中文乱码:OutputFormat output = OutputFormat.createPrettyPrint();output.setEncoding("utf-8");// 输出的编码utf-8// 把我们的xml文件更新XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), output);writer.write(document);writer.close();System.out.println("更新成功~");
}
}
其他
xml解析技术

相关文章:
Java Web(六)--XML
介绍 官网:XML 教程 为什么需要: 需求 1 : 两个程序间进行数据通信?需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码。spring 中的…...
智慧城市的新宠儿:会“思考”的井盖
在城市化飞速发展的今天,我们或许未曾过多地关注那些平凡却至关重要的井盖。它们无声地矗立在城市的每个角落,守护着深藏于地下的城市生命线,然而,这些井盖并未满足于传统的角色,它们正逐步融入智慧城市的宏大画卷中&a…...
Linux限定网络和工具环境下时间同步
使用curl或wget工具同步某网站时间到本地环境。 使用curl工具 #!/bin/bash# Replace example.com with the domain you want to query url"http://example.com"# Fetch HTTP header and extract Date field date_str$(curl -sI "$url" | grep -i "^…...
SQL Server查询计划(Query Plan)——文本查询计划
6.4.1. 文本查询计划 SQL Server中,除了通过GUI工具获取图形查询计划外,我们还可以通过相关命令获取文本格式的查询计划,这里惯称其为文本查询计划。文本查询计划中,SQL Server通过单独的一行来表示查询计划中的每个操作符,通过缩进格式和竖线(字符“|”)来…...
2024年2月的TIOBE指数,go语言排名第8,JAVA趋势下降
二月头条:go语言进入前十 本月,go在TIOBE指数前10名中排名第8。这是go有史以来的最高位置。当谷歌于2009年11月推出Go时,它一炮而红。在那些日子里,谷歌所做的一切都是神奇的。在Go出现的几年前,谷歌发布了GMail、谷歌…...
机器人十大前沿技术(2023-2024年)
2023-2024年机器人十大前沿技术 1. 具身智能与垂直大模型 具身智能是指拥有自主感知、交互和行动能力的智能体,能够与环境进行实时互动,从而实现对环境的理解和适应。 “大模型”是指在深度学习和人工智能领域中,使用大量参数和数据进行训…...
Spring: MultipartFile和File的区别
文章目录 一、MultipartFile和File对比1、 MultipartFile:2、File: 一、MultipartFile和File对比 MultipartFile 和 File 是用于处理文件上传的两种不同类型,主要在不同的编程环墨境中使用。 1、 MultipartFile: - MultipartFi…...
ncnn之三(补充):window环境下vs2022安装ncnn+protobuf
启动VS2022 下面的 x64 Native Tools Command Prompt for VS2022 protobuf git clone gitgithub.com:protocolbuffers/protobuf.git# 或者 下载 https://github.com/google/protobuf/archive/v3.11.2.zip cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPERelease -D…...
第五篇【传奇开心果系列】Python文本和语音相互转换库技术点案例示例:详细解读pyttsx3的`preprocess_text`函数文本预处理。
传奇开心果短博文系列 系列短博文目录Python文本和语音相互转换库技术点案例示例系列 短博文目录前言一、pyttsx3的preprocess_text函数文本预处理基本用法示例代码二、实现更复杂的文本预处理逻辑示例代码三、去除停用词、词干提取示例代码四、词形还原、拼写纠正示例代码五、…...
logback实践
1:日志区分环境 2:debug info warn error日志文件不一样 3: 文件滚动日志 4:启动可带参数 --spring.profiles.activedev --log.levelinfo 5:可从配置文件中获取上下文参数 logback-spring.xml 放在 classpath 下面 <configuration scan"false" scanPer…...
深入理解java虚拟机---自动内存管理
2.2 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销…...
粉笔规范词积累(文化发展)
活态保护/活态传承 基本释义 是在文化遗产生成发展的环境当中进行保护和传承,在人民群众生产生活过程中进行传承与发展。 应用场景 当资料中出现“让文化遗产不仅‘活’在历史中,更‘活’在人们的生产生活中”等类似表述,可概括为“活态保…...
如何在Ubuntu部署Emlog,并将本地博客发布至公网可远程访问
文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…...
Axios
Axios简介 axios框架全称(ajax – I/O – system): 基于promise用于浏览器和node.js的http客户端,因此可以使用Promise API 一、axios是干啥的 说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时࿰…...
数据仓库选型建议
1 数仓分层 1.1 数仓分层的意义 **数据复用,减少重复开发:**规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。数据的逐层加工原则,下层包含了上层数据加工所需要的全量数据,这样的加工方…...
每日一题——LeetCode1470.重新排列数组
方法一 把数组的前n项看做一个数组,后n项看做一个数组,两个数组循环先后往res里push元素 var shuffle function(nums, n) {let res[]for(let i0;i<n;i){res.push(nums[i])res.push(nums[in])}return res }; 消耗时间和内存情况: 方法二…...
网络安全--网鼎杯2018漏洞复现(二次注入)
一、环境:在线测试平台 BUUCTF在线评测 (buuoj.cn) 二、进入界面先尝试万能账号 1or11# 换格式 hais1bux1 11or11# 三、万能的不行那我们就得想注册了,去register.php去看看 注册个账号 发现用户名回显,猜测考点为用户名处二次注入&…...
CSS篇--transform
CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离,垂直移动距离) translate() 如果只给一个值,表示x轴方法移动距离 单独设置某个方向的移动距离:translateX() transla…...
阿里云国际-在阿里云服务器上快速搭建幻兽帕鲁多人服务器
幻兽帕鲁是最近流行的新型生存游戏。该游戏一夜之间变得极为流行,同时在线玩家数量达到了200万。然而,幻兽帕鲁的服务器难以应对大量玩家的压力。为解决这一问题,幻兽帕鲁允许玩家建立专用服务器,其提供以下优势: &am…...
vite 快速搭建 Vue3.0项目
一、初始化项目 npm create vite-app <project name>二、进入项目目录 cd ……三、安装依赖 npm install四、启动项目 npm run dev五、配置项目 安装 typescript npm add typescript -D初始化 tsconfig.json //执行命令 初始化 tsconfig.json npx tsc --init …...
深入解析BulletinBoard:iOS上下文卡片库的完整架构指南与核心实现
深入解析BulletinBoard:iOS上下文卡片库的完整架构指南与核心实现 【免费下载链接】BulletinBoard General-purpose contextual cards for iOS 项目地址: https://gitcode.com/gh_mirrors/bu/BulletinBoard BulletinBoard是一个功能强大的iOS库,专…...
DynamiCrafter完全指南:从安装到生成高质量动画视频
DynamiCrafter完全指南:从安装到生成高质量动画视频 【免费下载链接】DynamiCrafter DynamiCrafter: Animating Open-domain Images with Video Diffusion Priors 项目地址: https://gitcode.com/gh_mirrors/dy/DynamiCrafter DynamiCrafter是一款强大的AI动…...
Comsol 单孔激光烧蚀:探索微观世界的烧蚀奥秘
comsol单孔激光烧蚀 在材料加工等众多领域,激光烧蚀技术凭借其高精度、非接触等优势备受瞩目。而 Comsol 作为一款强大的多物理场仿真软件,为我们深入研究激光烧蚀过程提供了有力工具。今天就来聊聊 Comsol 单孔激光烧蚀那些事儿。 Comsol 仿真原理 激…...
开源项目配置管理:ComfyUI-Manager路径优化与跨环境部署指南
开源项目配置管理:ComfyUI-Manager路径优化与跨环境部署指南 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various…...
医学影像3D可视化的技术革新:MRIcroGL如何重构临床诊断流程
医学影像3D可视化的技术革新:MRIcroGL如何重构临床诊断流程 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL 在医学影像分析…...
利用 Worker Threads 优化 Vite 构建性能的实战
背景在我们的前端工程化实践中,随着项目规模的扩大,构建效率问题逐渐凸显。特别是在生产环境构建流程中,为了保护源码逻辑,我们通常会引入 JavaScript 混淆工具(如 javascript-obfuscator)。这一步虽然必要…...
5个高效模块精通抖音视频批量下载工具:从技术原理到实战应用
5个高效模块精通抖音视频批量下载工具:从技术原理到实战应用 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback…...
如何零门槛构建企业级智能Agent?AI应用开发全攻略
如何零门槛构建企业级智能Agent?AI应用开发全攻略 【免费下载链接】fast-agent Code, Build and Evaluate agents - excellent Model and Skills/MCP/ACP Support 项目地址: https://gitcode.com/gh_mirrors/fa/fast-agent 在AI技术迅猛发展的今天࿰…...
北海本地人私藏的美食哪家好
在北海这座滨海城市,海鲜饮食的日常逻辑始终围绕着“活鲜”二字展开。本地食客习惯于清晨去渔港挑海鲜,或选择街边老店加工,追求的是食材本身的呼吸感与原味。而近年来,随着游客流量增长,海鲜餐饮的消费场景发生着结构…...
ERNIE-4.5-0.3B-PT创意写作实战:用AI帮你生成有画面感的场景描述
ERNIE-4.5-0.3B-PT创意写作实战:用AI帮你生成有画面感的场景描述 1. 为什么需要AI辅助创意写作 在内容创作领域,最令人头疼的莫过于如何让文字"活起来"。传统写作往往面临三大痛点: 画面感不足:描述停留在表面&#…...
