javaweb学习(day04-XML)

一、介绍

1 官方文档

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

 2 为什么需要 XML

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

XML 技术用于解决什么问题 

XML 快速入门 

4.1 需求分析/图解

需求: 使用 idea 创建 students.xml 存储多个学生信息

4.2 完成步骤 

4.2.1 步骤 1 

4.2.2 步骤 2 

4.2.3 步骤 3 

 4.2.4 创建 xml 步骤

二、XML语法 

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

2 文档声明 

3 元素 

<?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>
XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如
下几种书写形式,例如:
  • 包含标签体:<a>www.sohu.cn</a>
  • 不含标签体的:<a></a>, 简写为:<a/>
  • 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:<a>welcome to <b>www.sohu.org</a></b>

在很多时候,说 标签、元素、节点是相同的意思 

XML 元素命名规则:
  • 区分大小写,例如,<P><p>是两个不同的标记。
  • 不能以数字开头。
  • 不能包含空格。
  • 名称中间不能包含冒号(:)。
  • 如果标签单词需要间隔,建议使用下划线 比如 <book_title>hello</book_title>

4 属性

4.1. 属性介绍

 4.2 属性注意事项

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

 5 注释

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

6 CDATA ! 

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

        <![CDATA[

                这里可以把你输入的字符原样显示,不会解析 xml

        ]]>

  • 可以输入任意字符(除]]>外)
  •  不能嵌套
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 解读
<![CDATA[
这里可以把你输入的字符原样显示,不会解析 xml
]]>
-->
<students><student id="100"><name>jack</name><age>10</age><gender>男</gender><code><![CDATA[<name>mary</name><age>18</age><gender>女</gender>  ]]></code></student><student id="200"><name>mary</name><age>18</age><gender>女</gender></student><school>清华大学</school><city/>
</students>

 7 转义字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理

格式正规的 XML 文档-小结 

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

三、DOM4j 

1 文档

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

 2 XML 解析技术原理

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

 3 XML 解析技术介绍

早期 JDK 为我们提供了两种 xml 解析技术 DOM Sax 简介,这两种技术已经过时,知道有这两种技术即可

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

 第三方的 XML 解析技术

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

4 DOM4J 介绍 

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

5 解压 zip 文档, 参考 DOM4J 文档 

6 DOM4j 中,获得 Document 对象的方式

开发 dom4j 要导入 dom4j 的包 

6.1 读取 XML 文件,获得 document 对象

6.2. 解析 XML 形式的文本,得到 document 对象.

6.3 主动创建 document 对象 

7 DOM4j 应用实例 

7.1 使用 DOM4J students.xml 文件进行增删改查

  • 重点讲解查询(遍历和指定查询)
  • xml增删改使用少,作为扩展,给出案例

7.2. 引入 dom4j 的依赖的 jar  

7.3. 创建 students.xml 

<?xml version="1.0" encoding="utf-8" ?>
<students><student id="01"><name>小龙女</name><gender>女</gender><age>16</age><resume>古墓派掌门人</resume></student><student id="02"><name>欧阳锋</name><gender>男</gender><age>18</age><resume>白驼山,蛤蟆神功</resume></student>
</students>

7.4. 创建\Dom4j_.java

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.junit.Test;import java.io.*;
import java.util.List;/*** @author 林然* @version 1.0*/
public class Dom4j_ {/*** 演示如何加载 xml 文件*/@Testpublic void loadXML() throws DocumentException {//得到一个解析器SAXReader reader=new SAXReader();Document document=reader.read(new File("src/students.xml"));System.out.println(document);}/**** 遍历所有的student信息*/@Testpublic void listStus() throws DocumentException {//得到一个解析器SAXReader reader=new SAXReader();Document document=reader.read(new File("src/students.xml"));//1 得到rootElementElement rootElement=document.getRootElement();//2 得到rootElement的student ElementsList<Element> students=rootElement.elements("student");//System.out.println(students.size());for (Element student:students) {//element就是student元素//获取student的name元素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());}}@Testpublic void readOne() throws DocumentException {//指定读取第一个学生信息//得到一个解析器SAXReader reader=new SAXReader();Document document=reader.read(new File("src/students.xml"));//1 得到rootElementElement rootElement=document.getRootElement();//2 获取第一个学生Element student =(Element) rootElement.elements("student").get(0);//3 输出该学生的信息//获取student的name元素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());//4 获取student的属性System.out.println(student.attributeValue("id"));}/*** 加元素(要求: 添加一个学生到 xml 中) [不要求,使用少,了解]* @throws Exception*/@Testpublic void add() throws DocumentException, IOException {//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 下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*/@Testpublic 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*/@Testpublic 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("更新成功~");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java程序设计】【C00321】基于Springboot的在线租房和招聘平台(有论文)

基于Springboot的在线租房和招聘平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线租房和招聘平台&#xff0c;本系统有管理员、用户、房东以及公司四种角色&#xff1b; 管理员&#xff1a;首页、个人中心…

spring boot集成Elasticsearch 7.16.3

环境&#xff1a;Elasticsearch 版本 7.16.3 Elasticsearch for windows下载地址 windows 若依 spring boot版本 2.6.0 pom文件添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch<…

【Kubernetes】K3S

目录 前言一、原理单体架构高可用架构 二、初始化1.配置yum源2.关掉防火墙3.关掉selinux4. 修改内核参数5.关掉swap交换分区 三、安装master节点1. 安装container2.启动master服务 四、安装node节点五、卸载六、总结 前言 各位小伙伴们&#xff0c;大家好&#xff0c;小涛又来…

面试数据库篇(mysql)- 10事务中的隔离性是如何保证

锁:排他锁(如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁mvcc : 多版本并发控制MVCC 全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突 MVCC的具体实现,主要依赖于数据库记录中的隐式字段…

Sui在AIBC Eurasia奖项评选中被评为2024年度最佳区块链解决方案

自2023年主网上线以来&#xff0c;经历了爆炸性增长的Layer1区块链Sui在2月25–27日迪拜举办的第二届AIBC Eurasia活动中获得“2024最佳区块链解决方案奖”&#xff08;Best Real World Application Award 2024&#xff09;。这个盛大的活动以世界级的参与者和往届获奖者而闻名…

mongoose源码解读(二) -- mg_mgr_init 初始化

在用 mongoose 源码开发的时候&#xff0c;这个初始化函数 mg_mgr_init&#xff08;&#xff09;则是必须的&#xff0c;我们看下它到底做了哪些初始化操作。 void mg_mgr_init(struct mg_mgr *m, void *user_data) {struct mg_mgr_init_opts opts;memset(&opts, 0, sizeo…

Leetcode : 移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a;遍历数组元素&#xff0c;判定为0&#xff0c;则采用erase从数组删除&…

算法修炼-动态规划之斐波那契数列模型

一、动态规划的算法原理 这是本人动态规划的第一篇文章&#xff0c;所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满dp表&#xff08;一段数组&#xff09;。首先要先确定好dp表每个位置的值所代表的含义是什么&#xff0c…

JavaEE——简单认识JavaScript

文章目录 一、简单认识 JavaScript 的组成二、基本的输入输出和简单语法三、变量的使用四、JS 中的动态类型图示解释常见语言的类型形式 五、JS中的数组六、JS 中的函数七、JS 中的对象 一、简单认识 JavaScript 的组成 对于 JavaScript &#xff0c;其中的组成大致分为下面的…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水果质量识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;本篇博客详尽介绍了一套基于深度学习的水果质量识别系统及其实现代码。系统采用了尖端的YOLOv8算法&#xff0c;并与YOLOv7、YOLOv6、YOLOv5等前代算法进行了详细的性能对比分析&#xff0c;提供在识别图像、视频、实时视频流和批量文件中水果方面的高效准确性…

【探索AI】探索未来-计算机专业必看的几部电影

计算机专业必看的几部电影 计算机专业必看的几部电影&#xff0c;就像一场精彩的编程盛宴&#xff01;《黑客帝国》让你穿越虚拟世界&#xff0c;感受高科技的魅力&#xff1b;《社交网络》揭示了互联网巨头的创业之路&#xff0c;《源代码》带你穿越时间解救世界&#xff0c;…

【Java程序设计】【C00327】基于Springboot的高校教师教研信息填报系统(有论文)

基于Springboot的高校教师教研信息填报系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的高校教师教研信息填报系统&#xff0c;本系统有管理员、教研管理以及教研人员三种角色&#xff1b; 管理员&#xff1a…

行为树入门:BehaviorTree.CPP Groot2练习(叶子节点)(2)

以《行为树BehaviorTree学习记录1_基本概念》练习。 1 SequenceNode顺序控制节点 代码下载 git clone https://gitee.com/Luweizhiyuan2020/ros2_bt.git例程 1.1 sequence 顺序执行 下载版本SequenceNode1。 1.2 ReactiveSequence 异步执行 注意&#xff1a; ①only a…

打造透明银行存储:Solidity智能合约的实践与探索

引言&#xff1a; 随着区块链技术的快速发展&#xff0c;智能合约作为其中的核心组件&#xff0c;正被越来越多地应用于各种场景。作为智能合约的编程语言&#xff0c;Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中&#xff0c;我们将通过构建一个透明的银行存储…

shell自定义日志输出函数log

Background 在编写比较复杂的脚本时&#xff0c;需要输出相关日志信息&#xff0c;方便知悉脚本的执行情况以及问题的排查。 源码 log.sh # 自定义日志函数 function log(){if [[ $1 "i" || $1 "info" ]]; thenecho -ne "\033[1;34mINFO: \033[0m&…

如何将字体添加到 ONLYOFFICE 桌面编辑器8.0

作者&#xff1a;VincentYoung 为你写好的文字挑选一款好看的字体然而自带的字体列表却找不到你喜欢的怎么办&#xff1f;这只需要自己手动安装一款字体即可。这里教你在不同的桌面操作系统里的多种字体安装方法。 ONLYOFFICE 桌面编辑器 ONLYOFFICE 桌面编辑器是一款免费的办…

《互联网的世界》第三讲-tcp

dns 找到了地址&#xff0c;spf 确定了路径&#xff0c;如何运输数据呢&#xff1f;今天讲 tcp。 计算机网络领域的特定技术是最后当你干这个事时才要用的&#xff0c;我对孩子们这样说&#xff0c;实际上你可以随便看一个快递单子来理解端到端传输协议。 源地址&#xff0c…

qtcreator-ros 安装记录

文章目录 ros_qtc_pluginros_qt_demo参考链接ros_qtc_plugin ROS Qt Creator 插件是专门为 ROS 开发的,通过简化任务和为 ROS 工具创建集中位置来提高开发人员的效率。由于它建立在Qt Creator平台之上,用户可以访问其所有现有功能,例如:语法高亮,代码索引,编辑器(C++,…

[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

【Intel oneAPI实战】使用英特尔套件解决杂草-农作物检测分类的视觉问题

目录 一、简介&#xff1a;计算机视觉挑战——检测并清除杂草二、基于YOLO的杂草-农作物检测分类2.1、YOLO简介2.2、基于YOLO的杂草-农作物检测分类解决方案 三、基于YOLO的杂草-农作物检测分类系统设计3.1、基于flask框架的demo应用程序后端3.2、基于Vue框架的demo应用程序前端…