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 版本之前存在安全漏洞&…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
