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.rhkb.cn/news/266174.html

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

相关文章

php基础学习之错误处理(其一)

一&#xff0c;错误处理的概念 错误处理指的是系统(或者用户)在执行某些代码的时候&#xff0c;发现有错误&#xff0c;就会通过错误处理的形式告知程序员&#xff0c;俗称报错 二&#xff0c;错误分类 语法错误&#xff1a;书写的代码不符合 PHP 的语法规范&#xff0c;语法错…

Qt Android sdk配置报错解决

使用的jdk8总是失败&#xff0c;报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17&#xff0c;就配置生效了。Android sdk路径可以选用Android Studio自带的&#xff0c;但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后&#xff0c;点击‘测试连接’&#xff0c;若提示成功&#xff0c;则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数&#xff1a; mail.catchall.alias: 收件服…

300分钟吃透分布式缓存(拉钩教育总结)

开篇寄语 开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 你好&#xff0c;我是你的缓存老师陈波&#xff0c;可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚&#xff0c;经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…

代码随想录算法训练营 Day29 | LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列 II

LeetCode491.递增子序列 该题强调与之前的题目的不同在于给的数组顺序不能变换&#xff0c;这就导致了不能用used数组判断与前一个元素是否相同的方法进行去重的操作&#xff0c;因此该题加入了一个set&#xff0c;不和前一个元素比&#xff0c;而是判断之前有没有处理过这个值…

网工内推 | 项目经理,软考证书优先,最高26K,加班补贴

01 龙盈智达 招聘岗位&#xff1a;项目经理 职责描述&#xff1a; 1 根据业务员需求&#xff0c;完成生态圈下账簿中心系统的开发管理工作。 2 负责账簿中心实施过程中的需求调研分析、方案设计、开发测试、系统上线等工作的计划、组织协调、沟通等方面管理工作。 3 完成系统核…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

RabbitMQ的常见工作模式

Work queues 工作队列模式 模式说明 通过Helloworld工程我们已经能够构建一个简单的消息队列的基本项目&#xff0c;项目中存在几个角色:生产 者、消费者、队列&#xff0c;而对于我们真实的开发中 &#xff0c;对于消息的消费者通过是有多个的。 比如在实现用户注册功能时&…

社区团购小程序有哪些功能 怎么制作开通

​随着社区团购的兴起&#xff0c;越来越多的人开始关注社区团购小程序的制作。社区团购小程序是一种基于移动互联网的新型购物方式&#xff0c;通过小程序&#xff0c;用户可以在社区内方便地参与团购活动&#xff0c;享受到更优惠的价格和更方便的购物体验。下面具体介绍社区…

Vite 构建的 Vue3 项目如何整合 Monaco Editor 代码编辑器

目录 &#x1f981; 一. 前言&#x1f981; 二. 探索过程2.1 安装2.2 配置 Monaco Editor2.3 编写 Monaco Editor 代码编辑器2.3.1 创建 Coding Editor 组件2.3.2 父组件使用 CodingEditor 组件 2.4 效果展示 三. 总结 &#x1f981; 一. 前言 各位好&#xff01;我是&#x1…

【分布式事务 XA模式】MySQL XA模式详解

MYSQL中的XA事务 写在前面1. XA事务的基本原理2. MySQL XA事务操作 写在前面 MySQL 的 5.0.3 版本开始支持XA分布式事务&#xff0c;并且只有innoDB存储引擎支持XA事务。 1. XA事务的基本原理 XA事务本质上是一种基于两阶段提交的分布式事务&#xff0c;分布式事务可以理解成…

R语言数学建模(二)—— tidymodels

R语言数学建模&#xff08;二&#xff09;—— tidymodels 文章目录 R语言数学建模&#xff08;二&#xff09;—— tidymodels前言一、示例数据集二、拆分数据集2.1 拆分数据集的常用方法2.2 验证集2.3 多层次数据2.4 其他需考虑问题 三、parsnip用于拟合模型3.1 创建模型3.2 …

redis启动错误

错误&#xff1a; Creating Server TCP listening socket 127.0.0.1:6379: bind: No error redis-server.exe redis.windows.conf redis-cli.exe shutdown auth "yourpassword"

嵌入式 Linux 下的 LVGL 移植

目录 准备创建工程修改配置修改 lv_drv_conf.h修改 lv_conf.h修改 main.c修改 Makefile 编译运行更多内容 LVGL&#xff08;Light and Versatile Graphics Library&#xff0c;轻量级通用图形库&#xff09;是一个轻量化的、开源的、在嵌入式系统中广泛使用的图形库&#xff0c…

配电房轨道式巡检机器人方案

一、应用背景 在变电站、配电房、开关站等各种室内变配电场所内&#xff0c;由于变配电设备的数量众多、可能存在各类安全隐患&#xff0c;为了保证用电的安全可靠&#xff0c;都要进行日常巡检。 但目前配电房人工巡检方式有以下主要问题&#xff1a; 巡检工作量大、成本高 …

k8s初始化报错 [ERROR CRI]: container runtime is not running: ......

一、环境参数 linux系统为centos7kubernetes版本为v1.28.2containerd版本为1.6.28 二、报错内容 执行初始化命令kubeadm init命令时报错&#xff0c;内容如下 error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR CRI]: container runtime is…

HarmonyOS开发云工程与开发云函数

创建函数 您可直接在DevEco Studio创建函数、编写函数业务代码、为函数配置调用触发器。 1.右击“cloudfunctions”目录&#xff0c;选择“New > Cloud Function”。 2.输入函数名称后&#xff0c;点击“OK”。 函数名称仅支持小写英文字母、数字、中划线&#xff08;-&a…

1.1 编程环境的安装

汇编语言 汇编语言环境部署 第二个运行程序直接双击安装一直下一步即可MASM文件复制到D盘路径下找到dosbox安装路径&#xff1a;C:\Program Files (x86)\DOSBox-0.74找到该文件双击打开它&#xff0c;修改一下窗口大小 把这两行改成如下所示 运行dos&#xff0c;黑框中输入mou…

Go Run - Go 语言中的简洁指令

原文&#xff1a;breadchris - 2024.02.21 也许听起来有些傻&#xff0c;但go run是我最喜欢的 Go 语言特性。想要运行你的代码&#xff1f;只需go run main.go。它是如此简单&#xff0c;我可以告诉母亲这个命令&#xff0c;她会立即理解。就像 Go 语言的大部分功能一样&…

vue 部署后修改配置文件(接口IP)

近期&#xff0c;有一个项目&#xff0c;运维在部署的时候&#xff0c;接口ip还没有确定&#xff0c;而且ip后面的路径一直有变动&#xff0c;导致我这里一天打包至少四五次才行&#xff0c;很麻烦&#xff0c;然后看了下有没有打包后修改配置文件修改接口ip的方法&#xff0c;…