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

文章目录

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

  1. 能存储复杂的数据关系

❄️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、文档声明

javascript 复制代码
<?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 元素,节点,标签
java 复制代码
<?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>
java 复制代码
<?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"> 是错误的
java 复制代码
<?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
]]>

  • 可以输入任意字符(除]]>外)
  • 不能嵌套
java 复制代码
<?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 文件

java 复制代码
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 信息

java 复制代码
@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
java 复制代码
@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 中) [不要求,使用少,了解]

java 复制代码
@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.//删除元素(要求:删除第一个学生) 使用少,了解

java 复制代码
@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) 使用少,了解

java 复制代码
@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 对象

解题:

java 复制代码
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);
		}
	}
}
相关推荐
余防12 小时前
XXE - 实体注入(xml外部实体注入)
xml·前端·安全·web安全·html
未来之窗软件服务19 小时前
万象EXCEL开发(四)格式解读theme1.xml ——东方仙盟练气期
xml·仙盟创梦ide·东方仙盟·万象excel
未来之窗软件服务2 天前
万象EXCEL开发(二)格式解读sharedStrings.xml——东方仙盟练气期
xml·excel·仙盟创梦ide·东方仙盟·万象excel·东方仙盟格式
goTsHgo3 天前
Spring XML 配置简介
xml·java·spring
半导体守望者3 天前
TR帝尔编码器GSD文件 PROFIBUS XML PROFINET EtherCAT 文件 ADH CDH CMV等
xml·经验分享·笔记·机器人·自动化·制造
极光雨雨3 天前
XML中的 CDATA mybaitis xml中的 <![CDATA[ xxxx ]]>
xml
未来之窗软件服务3 天前
万象EXCEL开发(三)格式解读calcChain.xml——东方仙盟练气期
xml·仙盟创梦ide·东方仙盟·万象excel
MintYouth3 天前
【精】C# 精确判断XML是否存在子节点
xml·c#
qq_318693014 天前
XML 站点地图制作与提交全流程,新站收录效率提升 50%
xml·数据库·mysql
卷Java4 天前
WXML 编译错误修复总结
xml·java·前端·微信小程序·uni-app·webview