JAVAWeb05-xml、DOM4J

news/2024/5/21 1:48:20

1. xml概述

1.1 官方文档

地址: https://www.w3school.com.cn/xml/index.asp

1.2 为什么需要 XML

  1. 需求 1 : 两个程序间进行数据通信?
  2. 需求 2 : 给一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码
  3. spring 中的 ico 配置文件,beans.xml mybatis XXXMapper.xml tomcat server.xml web.xml maven pom.xml
  4. 能存储复杂的数据关系
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8"?>
<贾府><贾演><贾代化><贾敬></贾敬></贾代化></贾演><贾源><贾代善><贾政></贾政></贾代善></贾源>
</贾府>

1.3 XML 技术用于解决什么问题

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

2. XML 快速入门

2.1 需求分析/图解

需求: 使用 idea 创建 students.xml 存储多个学生信息
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!--解读1 xml :表示该文件的类型 xml2 version="1.0"版本3 encoding="UTF-8" 文件编码4. students: root元素/根元素, 程序员自己来定5. <student></student> 表示students一个子元素, 可以有多个6. id就是属性 name, age, gender 是student元素的子元素7. 一个xml文件只能有有一个根节点
-->
<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>

3. XML 语法

3.1 一个 XML 文件分为如下几部分内容

1、文档声明
2、元素
3、属性
4、注释
5、CDATA 区 、特殊字符, 后面会说

3.2 文档声明

<?xml version="1.0" encoding="utf-8"?>
1、XML 声明放在 XML 文档的第一行
2、XML 声明由以下几个部分组成:

  • version - -文档符合 XML1.0 规范,我们学习 1.0
  • encoding - -文档字符编码,比如"utf-8"

3.3 元素

  1. 元素语法要求
  • 每个XML文档必须有且只有一个根元素。
  • 根元素是一个完全包括文档中其他所有元素的元素。
  • 根元素的起始标记要放在所有其他元素的起始标记之前。
  • 根元素的结束标记要放在所有其他元素的结束标记之后。
  1. XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
  • 包含标签体:<a>www.sohu.cn</a>
  • 不含标签体的:<a></a>, 简写为:<a/>
  • 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:<a>welcome to <b>www.sohu.org</a></b>
  1. 提示:在很多时候,说 标签、元素、节点是相同的意思

应用实例:
创建 students02.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!--解读1.每个XML文档必须有且只有一个根元素。2.根元素是一个完全包括文档中其他所有元素的元素。3.根元素的起始标记要放在所有其他元素的起始标记之前。4.根元素的结束标记要放在所有其他元素的结束标记之后5.XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式包含标签体:<a>www.sohu.cn</a>不含标签体的:<a></a>, 简写为:<a/>6.一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套7. 叫法student 元素,节点,标签
-->
<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>
  1. XML 元素命名规则
  • 区分大小写,例如,<P>和<p>是两个不同的标记。
  • 不能以数字开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)。
  • 如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>

创建 语法/students03.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--解读1.区分大小写,例如,<P>和<p>是两个不同的标记。2.不能以数字开头。3.不能包含空格。4.名称中间不能包含冒号(:)。5.如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>
-->
<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>

3.4 属性

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

属性应用实例
students04.xml

<?xml version="1.0" encoding="utf-8" ?>
<!--解读1.属性值用双引号(")或单引号(')分隔(如果属性值中有',用"分隔;有",用'分隔)2.一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">3.特定的属性名称在同一个元素标记中只能出现一次4.属性值不能包括& 字符
-->
<students><!--举例:id='01' 也是正确写法如果属性值有" 则使用' 包括属性 比如 id="xxx'yyy"如果属性值有' 则使用" 包括属性 比如 id='xxx"yyy'属性名在同一个元素标记只能出现一次 <stduent id="01" id="03"> 错误的属性值不能包括& 字符 比如: <stduent id="0&1"> 是错误的--><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>

3.5 注释

  1. <!--这是一个注释- ->
  2. 注释内容中不要出现- -;
  3. 不要把注释放在标记中间;错误写法 <Name <!--the name-->>TOM</Name>
  4. 注释不能嵌套;
  5. 可以在除标记以外的任何地方放注释

3.6 CDATA 节!

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

  1. 语法:
    <![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>
  2. 可以输入任意字符(除]]>外)
  3. 不能嵌套

应用实例
cdata_student.xml

<?xml version="1.0" encoding="utf-8"?>
<!--解读1.CDATA是大写的<![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>

4. 转义字符

  1. 对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理
    在这里插入图片描述
    应用实例:
    创建 xml_char.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--解读对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理比如 > < & ' ""
-->
<students><stduent id="01"><name>tom</name><gender></gender><age>28</age><!--使用转义字符表示一些特殊字符<resume>年龄<100 &版权</resume>--><resume>年龄&lt;10 &gt; &amp;</resume></stduent><stduent id="02"><name>scott</name><gender></gender><age>17</age></stduent>
</students>

5. 格式正规的 XML 文档-小结

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

6. DOM4j

6.1 文档

文档: https://dom4j.github.io/javadoc/1.6.1/

6.2 XML 解析技术原理

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

6.3 XML 解析技术介绍

● 早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介

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

● 第三方的 XML 解析技术

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

6.4 DOM4J 介绍

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

6.5 解压给的 zip 文档, 参考 DOM4J 文档

● 说明:dom4j 的文档在解压后 docs\index.html

在这里插入图片描述

6.6 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");

6.7 DOM4j 应用实例

  1. 使用 DOM4J 对 students.xml 文件进行增删改查
  • 重点讲解查询(遍历和指定查询)
  • xml增删改使用少,作为扩展,给出案例
  1. 引入 dom4j 的依赖的 jar 包
    在这里插入图片描述
  2. 创建 students.xml
<?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>
  1. 创建 Dom4j_.java

document源码分析图
在这里插入图片描述
演示 Dom4j 对 xml 文件的增删改查/遍历

/**
* 演示如何加载xml文件
*/
@Test
public void loadXML() throws DocumentException {//得到一个解析器SAXReader reader = new SAXReader();//老师的代码技巧->debug 看看document对象的属性//分析了document对象的底层结构 如上图Document document = reader.read(new File("src/students.xml"));System.out.println(document);}/*** 遍历所有的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, 你是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();//老师的代码技巧->debug 看看document对象的属性//分析了document对象的底层结构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("更新成功~");
}

6.8 课后作业

在这里插入图片描述

books.xml

<?xml version="1.0" encoding="UTF-8" ?>
<books><book id="100"><name>西游记</name><author>吴承恩</author><price>80</price></book><book id="200"><name>三国</name><author>罗贯中</author><price>100</price></book>
</books>

Book.java

public class Book {private Integer id;private String name;private String author;private Double price;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}@Overridepublic String toString() {return "Book{" +"id=" + id +", name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +'}';}
}

Homework.java

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://wed.xjx100/news/89829.html

相关文章

图元操作(理论)

图元操作理论知识 Graphics View框架结构的主要特点 在Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的交互能力提高1倍,图元能够处理键盘事件和鼠标事件。其中,鼠…

PostgreSQL (四) 索引

1.优点 创建唯一索引,保证数据的唯一性加快数据的查询速度建立索引可以加快表与表之间的连接为用来排序或者是分组的字段添加索引可以加快分组和排序顺序 2.原则 序号原则1选择唯一性索引2为经常需要排序、分组和联合操作的字段建立索引3为常作为查询条件的字段建立索引4限制…

Filter 过滤器 Listener 监听器

Filter web中的过滤器当用户访问服务器资源时&#xff0c;过滤器将请求拦截下来&#xff0c;完成一些通用的操作应用场景如&#xff1a;登录验证、统一编码处理、敏感字符过滤 编写filter对目标资源servlet进行拦截 1. 编写java类&#xff0c;实现filter接口 public class Qu…

BGP路由优选实验

一&#xff0c;实验要求及其拓扑图 二&#xff1a;划分好IP的拓扑 三&#xff1a; 实验分析 1、使用 Preval 策略&#xff0c;确保R4通过R2到达192.168.10.0/24 1、抓取流量 [r4]ip ip-prefix PV permit 192.168.10.0 24 2、配置策略 [r4]route-policy PV permit node 10 [r4…

【LeetCode: 337. 打家劫舍 III | 暴力递归=>记忆化搜索=>动态规划 | 树形dp】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

规模化敏捷框架:Spotify

Spotify 是全球最大、最受欢迎的流媒体音乐服务平台&#xff0c;预估用户总量已达2.86亿。Spotify 取得成功的一个关键因素就在于公司采用了一个独特方法: 围绕工作任务进行组织构建以提高团队敏捷性。Spotify 工程团队把提高团队敏捷性的经验记录了下来&#xff0c;并把经验分…

【华为OD机试真题】字符串解密(javaC++python)100%通过率

字符串解密 知识点数组字符串排序 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 给定两个字符串string1和string2。 string1是一个被加扰的字符串。string1由小写英文字母(‘a’~‘z’)和数字字符 (‘0’~ ‘9’)组成,而加扰字符串由’0’~ ‘9’、‘a’~f’…

Springcloud核心组件

在这里总结一下所有组件&#xff1a; springcloud是分布式微服务的一站式解决方案&#xff0c;可以说微服务是一个概念&#xff0c;而springcloud就是这个的实现 springcloud有五大核心组件&#xff1a; 注册中心 引言 由于微服务处于不同的进程&#xff0c;也就是说&…