【Javaweb05】 XML探秘:解码数据的哲学,构建跨界的沟通桥梁

server/2025/1/24 4:58:32/
xmlns="http://www.w3.org/2000/svg" style="display: none;">

在这里插入图片描述

文章目录

    • 前言
    • 🌍一.XML简介
      • ❄️1.为什么需要 XML
      • ❄️2.XML 技术用于解决什么问题
      • ❄️ 3.XML概念和特点
    • 🌍二.XML 语法
      • ❄️ 1、文档声明
      • ❄️ 2、元素
      • ❄️3、元素命名规则
      • ❄️ 4、属性
      • ❄️ 5、CDATA 区
    • 🌍三.XML 解析技术原理之DOM4j
      • ❄️ 1.XML 解析技术原理
      • ❄️ 2.三种XML 解析技术介绍
      • ❄️ 3.DOM4J 介绍
      • ❄️ 4.DOM4j 中,获得 Document 对象的方式有三种


🙋‍♂️ 作者:@whisperrr.🙋‍♂️

👀 专栏:JavaWeb👀

💥 标题:【Javaweb05】 XML探秘:解码数据的哲学,构建跨界的沟通桥梁💥

❣️ 寄语:比较是偷走幸福的小偷❣️

前言

在数据交换和配置文件领域,XML(可扩展标记语言)一直占据着重要地位。本文将带您了解XML的基本概念、语法规则、应用场景以及如何在编程语言中操作XML,学习一个新技术时,总离不开两个问题,为什么学习这个技术,又能解决什么问题。

🌍一.XML简介

❄️1.为什么需要 XML

1.需求 1 : 两个程序间进行数据通信?
2.需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码
3、spring 中的 ico 配置文件,beans.xml mybatis XXXMapper.xml tomcat server.xml web.xml maven pom.xml
4. 能存储复杂的数据关系

❄️2.XML 技术用于解决什么问题

● 解决程序间数据传输的问题:=> json
比如 qq 之间的数据传送,用 xml 格式来传送数据,具有良好的可读性,可维护性。
xml 可以做配置文件
xml 文件做配置文件可以说非常的普遍,比如我们的 tomcat 服务器的 server.xml ,web.xml
xml 可以充当小型的数据库 => 程序自己的数据格式存放
xml 文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增加维护数据库工作),可以考虑直接用 xm 来做小型数据库 ,而且直接读取文件显然要比读取数据库快

❄️ 3.XML概念和特点

XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。它由W3C(万维网联盟)制定,于1998年发布为推荐标准。XML具有以下特点:

可扩展性:用户可以自定义标签,满足各种数据表示需求。
自描述性:XML文档包含有关其内容的元数据。
跨平台:XML数据可在不同系统或程序之间轻松共享和传输。

🌍二.XML 语法

❄️ 1、文档声明

<?xml version="1.0" encoding="utf-8" ?>

1、XML 声明放在 XML 文档的第一行
2、XML 声明由以下几个部分组成:
3、version - -文档符合 XML1.0 规范,我们学习 1.0
4、encoding - -文档字符编码,比如"utf-8"

❄️ 2、元素

元素语法要求

  • 每个XML文档必须有且只有一个根元素。
  • 根元素是一个完全包括文档中其他所有元素的元素。
  • 根元素的起始标记要放在所有其他元素的起始标记之前。
  • 根元素的结束标记要放在所有其他元素的结束标记之后。
  • XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一
    个标签有如下几种书写形式包含标签体:<a>www.sohu.cn</a>不含标签体的:<a></a>, 简写为:<a/>
  • 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套
  • 叫法 student 元素,节点,标签
<?xml version="1.0" encoding="utf-8" ?><students><student id="100"><name>jack</name><age>10</age><gender></gender></student><student id="200"><name>mary</name><age>18</age><gender></gender></student><school>清华大学</school><city/>
</students>

❄️3、元素命名规则

XML 元素命名规则

  • 区分大小写,例如,<P><p>是两个不同的标记。
  • 不能以数字开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)
  • 如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>
<?xml version="1.0" encoding="utf-8" ?>
<students><student id="100"><name>jack</name><age>10</age><gender></gender><email>jack@sohu.com</email><Email>jack2@sohu.com</Email><job>java 工程师</job><book_name>三国</book_name></student><student id="200"><name>mary</name><age>18</age><gender></gender></student>
</students>

❄️ 4、属性

1.属性值用双引号(“)或单引号(‘)分隔(如果属性值中有’,用"分隔;有”,用’分隔)
2.一个元素可以有多个属性,它的基本格式为:<元素名 属性名=“属性值”>
3.特定的属性名称在同一个元素标记中只能出现一次
4.属性值不能包括& 字符

举例:

  • id=‘01’ 也是正确写法
  • 如果属性值有" 则使用’ 包括属性 比如 id=“xxx’yyy”
  • 如果属性值有’ 则使用" 包括属性 比如 id=‘xxx"yyy’
  • 属性名在同一个元素标记只能出现一次 <stduent id="01" id="03"> 错误的
  • 属性值不能包括& 字符 比如: <stduent id="0&1"> 是错误的
<?xml version="1.0" encoding="utf-8" ?><students>
<student id="100">
<name>jack</name>
<age>10</age>
<gender></gender>
</student>
<student id="200">
<name>mary</name>
<age>18</age>
<gender></gender>
</student>
</students>

❄️ 5、CDATA 区

有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记。

语法:

<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
  • 可以输入任意字符(除]]>外)
  • 不能嵌套
<?xml version="1.0" encoding="utf-8"?>
<!-- 
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
-->
<students>
<stduent id="01">
<name>tom</name>
<gender></gender>
<age>18</age>
<!-- 举例说明:
下面是一段 js 的代码片段. 直接放在<code></code>标签间,语法错误
使用 CDATA 节来处理即可. <script data-compress=strip>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu.com/');}</script>
-->
</stduent><stduent id="02"><name>scott</name><gender></gender><age>17</age><code><!--如果希望把某些字符串,当做普通文本,使用 CDATA 包括 --><![CDATA[<script data-compress=strip>function h(obj){obj.style.behavior='url(#default#homepage)';var a = obj.setHomePage('//www.baidu.com/');
}
</script>]]></code>
</stduent>
</students>

格式正规的 XML 文档-小结
遵循如下规则的 XML 文档称为格式正规的 XML 文档:
1、XML 声明语句 <?xml version="1.0" encoding="utf-8"?>
2、必须有且仅有一个根元素
3、标记大小,区分大小写的. 4、属性值用引号
5、标记成对
6、空标记关闭
7、元素正确嵌套

🌍三.XML 解析技术原理之DOM4j

❄️ 1.XML 解析技术原理

  1. 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的dom 技术来解析
  2. document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)

❄️ 2.三种XML 解析技术介绍

早期 JDK 为我们提供了两种 xml 解析技术

DOM 和 Sax 简介
1.dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析也做了实现
2.sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML ) SAX解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。 是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在性能上优于 Dom 解析

这两种技术已经过时,知道有这两种技术即可

第三方的 XML 解析技术
1.jdom 在 dom 基础上进行了封装
2.dom4j 又对 jdom 进行了封装。
3.pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件

❄️ 3.DOM4J 介绍

  1. Dom4j 是一个简单、灵活的开放源代码的库(用于解析/处理 XML 文件)。Dom4j 是由早期开发 JDOM 的人分离出来而后独立开发的。
  2. 与 JDOM 不同的是,dom4j 使用接口和抽象基类,虽然 Dom4j 的 API 相对要复杂一些,但它提供了比JDOM 更好的灵活性。
  3. Dom4j 是一个非常优秀的 Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的 Dom4j。
  4. 使用 Dom4j 开发,需下载 dom4j 相应的 jar 文件

❄️ 4.DOM4j 中,获得 Document 对象的方式有三种

开发 dom4j 要导入 dom4j 的包

1、读取 XML 文件,获得 document 对象
SAXReader reader = new SAXReader(); //创建一个解析器
Document document = reader.read(new File("src/input.xml"));//XML Document

2、解析 XML 形式的文本,得到 document 对象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);

3、主动创建 document 对象. Document document = DocumentHelper.createDocument(); //创建根节点
Element root = document.addElement("members");

代码演示:

1.演示如何加载 xml 文件

public class Dom4j_ {
@Test
public void loadXML() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//得到 document
Document document = reader.read(new File("src/students.xml"));
System.out.println(document);}
}

2.遍历所有的 student 信息


@Test
public void listStus() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//代码技巧->debug 看看 document 对象的属性
//分析了 document 对象的底层结构
Document document = reader.read(new File("src/students.xml"));
//1. 得到 rootElement, 你是 OOP
Element rootElement = document.getRootElement();
//2. 得到 rootElement 的 student Elements
List<Element> students = rootElement.elements("student");
//System.out.println(student.size());//2
for (Element student : students) {//element 就是 Student 元素/节点
//获取 Student 元素 的 name Element
Element 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());
}
}
  1. 指定读取第一个学生的信息 就是 dom4j+xpath
@Test
public void readOne() throws DocumentException {
//得到一个解析器
SAXReader reader = new SAXReader();
//老师的代码技巧->debug 看看 document 对象的属性
//分析了 document 对象的底层结构
Document document = reader.read(new File("src/students.xml"));
//1. 得到 rootElement, 你是 OOP
Element 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"));
}

4.加元素(要求: 添加一个学生到 xml 中) [不要求,使用少,了解]

@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();
}

5.//删除元素(要求:删除第一个学生) 使用少,了解


@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();
韩顺平 Java 工程师
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("删除成功~");
}

6.更新元素(要求把所有学生的年龄+3) 使用少,了解


@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+3
for (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("更新成功~");
}

习题练习:
(1) 遍历所有的 book 元素->得到每个 book 元素的信息
(2) 创建一个 Book 类,根据 book 元素信息来创建 book 对象
在这里插入图片描述

解题:


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
* @author 刘
* @version 1.0
*/
public class Homework {
public static void main(String[] args) throws DocumentException {
//1.得到解析器
SAXReader saxReader = new SAXReader();
//2.指定解析哪个 xml 文件
Document document = saxReader.read(new File("src/books.xml"));
//3.遍历所有的 book 元素
List<Element> books = document.getRootElement().elements("book");
for (Element book : books) {
//取出 book 元素的所有信息
Element name = book.element("name");
Element author = book.element("author");
Element price = book.element("price");
String id = book.attributeValue("id");
//创建成 Book 对象
Book book1 = new Book();
book1.setId(Integer.parseInt(id));
book1.setName(name.getText());
book1.setPrice(Double.parseDouble(price.getText()));
book1.setAuthor(author.getText());
System.out.println("book1 对象信息= " + book1);}}
}

http://www.ppmy.cn/server/160946.html

相关文章

NIO 和 Netty 在 Spring Boot 中的集成与使用

Netty到底是个啥&#xff0c;有啥子作用 1. Netty 的本质&#xff1a;对 NIO 的封装 NIO 的原生问题&#xff1a; Java 的 NIO 提供了非阻塞 I/O 和多路复用机制&#xff0c;但其使用较为复杂&#xff08;如 Selector、Channel、Buffer 的配置和管理&#xff09;。开发者需要自…

PL/SQL语言的图形用户界面

PL/SQL语言的图形用户界面 引言 随着信息技术的迅猛发展&#xff0c;数据库系统在现代应用程序中的重要性愈加凸显。PL/SQL&#xff08;Procedural Language/Structured Query Language&#xff09;作为Oracle数据库的一种程序设计语言&#xff0c;以其强大的数据处理能力和高…

修改docker共享内存shm-size

法1&#xff1a;在创建容器时增加共享内存大小 nvidia-docker run -it -p 10000:22 --name"zm" -v /home/zm:/data ufoym/deepo:all-cu101 /bin/bash --shm-size20G法2&#xff1a;修改正在运行的容器的共享内存设置 查看容器、共享内存 docker ps -a df -lh | gr…

计算机网络 (51)鉴别

前言 计算机网络鉴别是信息安全领域中的一项关键技术&#xff0c;主要用于验证用户或信息的真实性&#xff0c;以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身&#xff0c;对实体声称的身份进行唯一识别&#xff0c;以便验证其访问请…

从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)

从零到上线&#xff1a;Node.js 项目的完整部署流程&#xff08;包含 Docker 和 CI/CD&#xff09; 目录 项目初始化&#xff1a;构建一个简单的 Node.js 应用设置 Docker 环境&#xff1a;容器化你的应用配置 CI/CD&#xff1a;自动化构建与部署上线前的最后检查&#xff1a;…

【漫话机器学习系列】054.极值(Extrema)

极值&#xff08;Extrema&#xff09; 定义 极值是数学分析和优化问题中的一个核心概念&#xff0c;指函数在某个定义域内取得的最大值或最小值。根据极值的性质&#xff0c;可以将其分为两类&#xff1a; 局部极值&#xff08;Local Extrema&#xff09;&#xff1a;函数在…

西安交通大学COMP551605人工智能2024.1.3期末考试

西安交通大学COMP551605人工智能2024.1.3期末考试 有关的课程资料我的笔记放Github上了&#xff0c;欢迎来star 名词解释&#xff0c;5分一个&#xff0c;20分 知识阈值理论 限制策略 最一般合一 过拟合 简答题&#xff0c;8分一个&#xff0c;24分 归结演绎的含义和一…

Nginx正向代理配置

Nginx 正向代理默认只支持 http 协议&#xff0c;不支持 https 协议&#xff0c;需借助 "ngx_http_proxy_connect_module" 模块实现 https 正向代理&#xff0c;详情请参考&#xff1a; https://github.com/chobits/ngx_http_proxy_connect_module 安装Nginx某些模块…