Java XML
1、XML文件介绍
配置文件:用来保存设置的一些东西。
拿IDEA来举例,比如设置的背景图片,字体信息,字号信息和主题信息等等。
(1)以前是用txt保存的,没有任何优点,而且不利于阅读,因为只保存了值,而值所代表的含义却不清楚。

(2)后面又提出了properties文件,是以键值对的形式存储数据的,拿同一个信息来说,假如有多个用户的只需要存储,却只能用一个键值对来进行存储,无法为同一个信息配置多个键值对。

(3)所以现在来学习xml文件。xml文件可解决这个问题。
xml是可扩展的标记语言,那什么是可扩展?什么是标记语言?
标记就是标签。可扩展就是可以自定义标签。
下面是一个例子,可以很清楚地看到多个用户的不同信息。

2、XML文件基本语法
(1)XML文件的创建
文件后缀名为.xml,注意是小写的。

(2)XML文件的文档声明
第一行必须是文档声明,这个不需要去背,只需输入一个<,IDEA就会自动进行提示。
version:XML默认的版本号,该属性是必须存在的。
encoding:本XML文件的编码。
<?xml version="1.0" encoding="UTF-8" ?>

还有一点文档声明必须放在第一行顶格写,下面这两种不放在第一行和不顶格写都是错的。

(3)XML文件的标签规则
①标签必须成对出现,比如下面的student标签,且根标签只能有一个。
②也有一些特殊的单标签,比如<br/>。
③标签里面还可以有属性以及属性的值。
④标签中的文本内容,比如张三就是name标签的文本内容。

(4)XML文件的注释信息:<!- 注释内容 -->
不用记,只需要选中内容然后用IDEA的快捷键就可以了:crtl+shift。
(5)XML文件中的特俗符号
由于平常用来表示大于>、小于<等等的一些符号在XML文件中是用来表示标签的开始和结束的,所以提出了别的符号用来表示大于、小于这些。

(6)XML文件中的CDATA区
格式:<![CDATA[内容]]>
这种格式下的内容都会当成最原始的符号,不会有xml文件中的特殊意义,比如<就是小于的意思。
(7)代码书写要求
从左到右依次书写,当写完开始标签的>时会自动把结束标签补上。

3、XML文件的约束文档
由于XML文件可以自定义标签,如果随意定义会导致XML文件在解析时可能会出现问题。
为了避免这种情况的出现,就提出了一系列要求,强制程序员必须按照要求进行规定进行书写。
我们不用掌握约束文档怎么写,只需要根据给出的约束文档知道如何去编写XML文件就可以了。
约束分为两类:DTD和scheme。
(1)如何利用DTD约束文档编写一个符合要求的XML文件?

我们需要掌握的有3点:
①约束文档的格式为dtd。
②如何引入本地的dtd文件。

③如何根据约束书写XML文件。
(2)如何利用scheme约束文档编写一个符合要求的XML文件?
由于DTD约束文档没办法约束数据类型,所以提出了scheme约束文档。
(1)scheme约束文档的格式
scheme约束文档本身就是一个XML文件,也被其他的scheme约束文档所约束。

这是一个scheme约束文档的内容,其中需要学习的就是红色方框中的内容:

(2)如何引入scheme约束文档?
只需这一行就可以。

上面虽然讲了这么多,但真正需要掌握的就是把scheme约束文档复制到XML文件的目录下,然后输入<之后根据提示直接使用就可以了,都不需要写第二步。
4、XML文件的解析
解析XML文件就是读取文件中的数据。
解析的方式:Dom4j。
(1)Dom4j的解析方式
这种方式是读取整个XML文件之后,按照树形结构存储,大概就是下面图示的样子。以及需要掌握Doucument、Element、Attribute和Text4个对象的含义。

(2)如何使用Dom4j解析XML文件?
首先要想使用dom4j,就要先下载包,网址:DOM4J
还有一点就是从XML文件中解析完数据之后可以封装到对象中,要不然数据都是一个个零散的。
①比如有这样一个XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!--注释的内容-->
<!--本xml文件用来描述多个学生信息-->
<students><!--第一个学生信息--><student id="1"><name>张三</name><age>23</age></student><!--第二个学生信息--><student id="2"><name>李四</name><age>24</age></student></students>
②Student类:
public class Student {private String id;private String name;private int age;public Student() {}public Student(String id, String name, int age) {this.id = id;this.name = name;this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id='" + id + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}
③利用dom4j去解析XML文件:
1.获取一个解析器对象;
2.利用解析器把xml文件加载到内存中,并返回一个文档对象;
3.获取到根标签;
4.通过根标签来获取student标签;
elements():可以获取调用者所有的子标签,并把这些子标签放到一个集合中返回。
elements("标签名"):可以获取调用者指定的所有子标签,并把这些子标签放到一个集合中并返回。
/*** 利用dom4j解析xml文件*/
public class XmlParse {public static void main(String[] args) throws DocumentException {//1.获取一个解析器对象SAXReader saxReader = new SAXReader();//2.利用解析器把xml文件加载到内存中,并返回一个文档对象Document document = saxReader.read(new File("myxml\\xml\\student.xml"));//3.获取到根标签Element rootElement = document.getRootElement();//4.通过根标签来获取student标签//elements():可以获取调用者所有的子标签.会把这些子标签放到一个集合中返回.//elements("标签名"):可以获取调用者所有的指定的子标签,会把这些子标签放到一个集合中并返回//List list = rootElement.elements();List<Element> studentElements = rootElement.elements("student");//System.out.println(list.size());//用来装学生对象ArrayList<Student> list = new ArrayList<>();//5.遍历集合,得到每一个student标签for (Element element : studentElements) {//element依次表示每一个student标签//获取id这个属性Attribute attribute = element.attribute("id");//获取id的属性值String id = attribute.getValue();//获取name标签//element("标签名"):获取调用者指定的子标签Element nameElement = element.element("name");//获取这个标签的标签体内容String name = nameElement.getText();//获取age标签Element ageElement = element.element("age");//获取age标签的标签体内容String age = ageElement.getText();// System.out.println(id);
// System.out.println(name);
// System.out.println(age);Student s = new Student(id,name,Integer.parseInt(age));list.add(s);}//遍历操作for (Student student : list) {System.out.println(student);}}
}
(3)后面又提出了Xpath,可以根据如何使用Xpath解析XML文件。
Xpath底层依赖dom4j,所以如果要使用Xpath的话记得也要导dom4j的包。
有4种解析方式:绝对路径检索、相对路径检索、全文检索以及属性检索。
以及提供两个检索方法:
①selectNodes("路径"):查询满足路径的所有
②selectSingleNodes("路径"):查询满足路径的一个,如果同时有多个满足,则返回第一个。
关于路径有4种:
首先先来介绍一下各个符号的含义:/表示单级路径,//表示多级路径,@表示属性。
1.绝对路径:从根标签开始。
2.相对路径:相对于当前标签的路径,而.就表示当前标签的路径。
3.全文检索
①//name:在整个xml文件种查找name这个标签
②//person/name和//person//name两个的区别:
//person/name:是查找到person标签以后,再找person的子标签是name的。
//person//name:无论name是子标签还是孙标签都可以。
4.属性检索
①//@属性名,比如//@id
②//元素[@属性名]:查找带有属性名的标签
③//元素[@属性名 = '值']:查找带有属性为某个值的标签
相关文章:
Java XML
1、XML文件介绍 配置文件:用来保存设置的一些东西。 拿IDEA来举例,比如设置的背景图片,字体信息,字号信息和主题信息等等。 (1)以前是用txt保存的,没有任何优点,而且不利于阅读&a…...
好用的视频压缩工具有哪些?这4款千万不要错过
视频压缩的方法有很多种,像我们手机里的视频剪辑工具,手机和电脑自带的压缩功能,在线压缩网站,专业压缩软件压缩等等。不同的场景和需求下大家可以选择不同的工具,但是如果碰到需要大量和经常压缩视频的话,…...
【Python爬虫系列】_016.关于登录和验证码
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…...
基于opencv实现双目立体匹配点云距离
双目相机或两个单目相机。 一、相机标定 MATLAB软件,打开双目标定app。 点击add images,弹出加载图像的窗口,分别导入左图和右图,设置黑白格长度(标定板的长度一般为20)。 点击确定,弹出加载…...
RabbitMQ高级篇,进阶内容
强烈建议在看本篇博客之前快速浏览文章:RabbitMQ基础有这一篇就够了 RabbitMQ高级篇 0. 前言1. 发送者的可靠性1.1 生产者重试机制1.2 生产者确认机制1.3 实现生产者确认 2. MQ的可靠性2.1 MQ持久化2.2 LazyQueue 3. 消费者的可靠性3.1 消费者确认机制3.2 失败重试策…...
STM32重定义printf,实现串口打印
在“usart.c”文件中加入以下代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endifPUTCHAR_PROTOTYPE{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch; }…...
项目进度
变为负进度了,还是要用baseservlet,我就又重新写了一部分,看了好几遍视频,突然就想明白了,感觉每次要上课,就时间不连续思路总是断,今天晚自习算是搞懂了怎么写了,就是代码有点多&am…...
Android的内核
Android的内核是基于Linux的长期支持版本的“Android通用内核(ACK)”。 Android作为一个广泛使用的操作系统,其根基在于内核的设计和功能。下面将深入探讨Android内核的各个方面,从其基本结构到与Linux内核的关系,再到内核的版本管理及在设备…...
Github Wiki 超链接 转 码云Gitee Wiki 超链接
Github Wiki 超链接 转 码云Gitee Wiki 超链接 Github 是 :[[相对路径]] Gitee 是 :[链接文字](./相对路径) 查找:\[\[(.*?)\]\] 替换:[$1]\(./$1\) 或替换:**[$1]\(./$1\)** (码云的超链接,很…...
Android10源码刷入Pixel2以及整合GMS
一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…...
wpf触发与模板的使用示例:批量生产工具
批量生产工具 <Window x:Class"WpfM20UpdateFW.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expressio…...
brew install node提示:Error: No such keg: /usr/local/Cellar/node
打开本地文件发现Cellar目录下无法生成 node文件,应该是下载时出现问题,重复下载无法解决问题,只能重新安装brew。 步骤1(安装 brew): /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/ra…...
记录一下gitlab社区版的安装教程
目录 1.更新系统软件包 2.安装必要的依赖 3.添加GitLab源 3.1对于GitLab Enterprise Edition(EE): 3.2对于GitLab Community Edition(CE): 4.安装GitLab 4.1安装GitLab Enterprise Edition(E…...
20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?
在MyBatis中处理多表关联查询是一项常见的需求,特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询,常见的实现方式包括使用<association>和<collection>标签在<resultMap>中进行对象关系映射&…...
【百日算法计划】:每日一题,见证成长(013)
题目 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 输入:head [1,2,2,1] 输出:true 思路 找到中间节点反转后半部分链表前后链表顺序比…...
PCL 读取和保存点云
目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 1.1原理 PCL (Point Cloud Library) 是…...
js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】
js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中,遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法,…...
微信小程序-formData使用
作者:fyupeng 技术专栏:☞ https://github.com/fyupeng 项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 一、介绍 在小程序中使用formdata上传数据,可实现多文件上传 跟浏览器中的FormData对象类…...
潜在语义分析(Latent Semantic Analysis,LSA)—无监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习
定义 输入: X [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋮ ⋮ x m 1 x m 2 ⋯ x m n ] , 文本集合 D { d 1 , d 2 , ⋯ , d n } , 单词集合 W { ω 1 , ω 2 , ⋯ , ω m } , x i j : 单词 ω i 在文本 d j 中出现的频数或权值 X\left[ \begin{array}{cccc} x_{11} …...
【安全漏洞】MySQL 8.0.33 、CVE-2023-22102
mysql-connector-java:jar:8.0.33已经重新定位到mysql-connector-j:jar:8.0.33 安全漏洞描述 在SBOM扫描过程中,检测到mysql-connector-j:8.0.33存在如下高危安全漏洞: CVE-2023-22102:Oracle MySQL Connectors 8.1.0 版本之前存在安全漏洞&…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
