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 …...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...