当前位置: 首页 > news >正文

Java XML

1、XML文件介绍

配置文件:用来保存设置的一些东西。

拿IDEA来举例,比如设置的背景图片,字体信息,字号信息和主题信息等等。

(1)以前是用txt保存的,没有任何优点,而且不利于阅读,因为只保存了值,而值所代表的含义却不清楚。

515ac6e9feea4f0f8b6ba1ad63022b9d.png

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

adb60327ab1d4be5815430af3838565e.png

(3)所以现在来学习xml文件。xml文件可解决这个问题。

xml是可扩展的标记语言,那什么是可扩展?什么是标记语言?

标记就是标签。可扩展就是可以自定义标签。

下面是一个例子,可以很清楚地看到多个用户的不同信息。

3d0d19151722420caa13af031e261bd5.png

2、XML文件基本语法

(1)XML文件的创建

文件后缀名为.xml,注意是小写的。

477092e4dacb48689e54c8132ce9208f.png

(2)XML文件的文档声明

第一行必须是文档声明,这个不需要去背,只需输入一个<,IDEA就会自动进行提示。

version:XML默认的版本号,该属性是必须存在的。

encoding:本XML文件的编码。

<?xml version="1.0" encoding="UTF-8" ?>

bd02a12ac2f940e38e60d8f8f2a7cc82.png

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

c40b336f26534b39ab8b0b90b34bf5dc.png

(3)XML文件的标签规则

①标签必须成对出现,比如下面的student标签,且根标签只能有一个。

②也有一些特殊的单标签,比如<br/>。

③标签里面还可以有属性以及属性的值。

④标签中的文本内容,比如张三就是name标签的文本内容。

865f8f6b6aa846fabed9887bfb2bcb10.png

(4)XML文件的注释信息:<!- 注释内容 -->

不用记,只需要选中内容然后用IDEA的快捷键就可以了:crtl+shift。

(5)XML文件中的特俗符号

由于平常用来表示大于>、小于<等等的一些符号在XML文件中是用来表示标签的开始和结束的,所以提出了别的符号用来表示大于、小于这些。

92b1e9ee51884820acc1b430fa62250c.png

(6)XML文件中的CDATA区

格式:<![CDATA[内容]]>

这种格式下的内容都会当成最原始的符号,不会有xml文件中的特殊意义,比如<就是小于的意思。

(7)代码书写要求

从左到右依次书写,当写完开始标签的>时会自动把结束标签补上。

46f051ef7b344bf79e793563847a3d51.png

3、XML文件的约束文档

由于XML文件可以自定义标签,如果随意定义会导致XML文件在解析时可能会出现问题。

为了避免这种情况的出现,就提出了一系列要求,强制程序员必须按照要求进行规定进行书写。

我们不用掌握约束文档怎么写,只需要根据给出的约束文档知道如何去编写XML文件就可以了。

约束分为两类:DTD和scheme。

(1)如何利用DTD约束文档编写一个符合要求的XML文件?

4c19f7c09ec24b8480aa4a91cf3932c6.png

我们需要掌握的有3点:

①约束文档的格式为dtd。

②如何引入本地的dtd文件。

0dc2c890ec504e5ab007e21c2f480b01.png

③如何根据约束书写XML文件。

(2)如何利用scheme约束文档编写一个符合要求的XML文件?

由于DTD约束文档没办法约束数据类型,所以提出了scheme约束文档。

(1)scheme约束文档的格式

scheme约束文档本身就是一个XML文件,也被其他的scheme约束文档所约束。

6062c067265a4977bded086ebf8b3148.png

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

953fcd1d369f47539ff9f44b907b5e4f.png

 (2)如何引入scheme约束文档?

只需这一行就可以。

5fa615bfef0d494c887c92ef38dacac9.png

上面虽然讲了这么多,但真正需要掌握的就是把scheme约束文档复制到XML文件的目录下,然后输入<之后根据提示直接使用就可以了,都不需要写第二步。

4、XML文件的解析

解析XML文件就是读取文件中的数据。

解析的方式:Dom4j。

(1)Dom4j的解析方式

这种方式是读取整个XML文件之后,按照树形结构存储,大概就是下面图示的样子。以及需要掌握Doucument、Element、Attribute和Text4个对象的含义。

4a6e4452454c4682a1430c3d67dacc07.png

(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文件介绍 配置文件&#xff1a;用来保存设置的一些东西。 拿IDEA来举例&#xff0c;比如设置的背景图片&#xff0c;字体信息&#xff0c;字号信息和主题信息等等。 &#xff08;1&#xff09;以前是用txt保存的&#xff0c;没有任何优点&#xff0c;而且不利于阅读&a…...

好用的视频压缩工具有哪些?这4款千万不要错过

视频压缩的方法有很多种&#xff0c;像我们手机里的视频剪辑工具&#xff0c;手机和电脑自带的压缩功能&#xff0c;在线压缩网站&#xff0c;专业压缩软件压缩等等。不同的场景和需求下大家可以选择不同的工具&#xff0c;但是如果碰到需要大量和经常压缩视频的话&#xff0c;…...

【Python爬虫系列】_016.关于登录和验证码

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…...

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件&#xff0c;打开双目标定app。 点击add images&#xff0c;弹出加载图像的窗口&#xff0c;分别导入左图和右图&#xff0c;设置黑白格长度&#xff08;标定板的长度一般为20&#xff09;。 点击确定&#xff0c;弹出加载…...

RabbitMQ高级篇,进阶内容

强烈建议在看本篇博客之前快速浏览文章&#xff1a;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; }…...

项目进度

变为负进度了&#xff0c;还是要用baseservlet&#xff0c;我就又重新写了一部分&#xff0c;看了好几遍视频&#xff0c;突然就想明白了&#xff0c;感觉每次要上课&#xff0c;就时间不连续思路总是断&#xff0c;今天晚自习算是搞懂了怎么写了&#xff0c;就是代码有点多&am…...

Android的内核

Android的内核是基于Linux的长期支持版本的“Android通用内核(ACK)”。 Android作为一个广泛使用的操作系统&#xff0c;其根基在于内核的设计和功能。下面将深入探讨Android内核的各个方面&#xff0c;从其基本结构到与Linux内核的关系&#xff0c;再到内核的版本管理及在设备…...

Github Wiki 超链接 转 码云Gitee Wiki 超链接

Github Wiki 超链接 转 码云Gitee Wiki 超链接 Github 是 &#xff1a;[[相对路径]] Gitee 是 &#xff1a;[链接文字](./相对路径) 查找&#xff1a;\[\[(.*?)\]\] 替换&#xff1a;[$1]\(./$1\) 或替换&#xff1a;**[$1]\(./$1\)** &#xff08;码云的超链接&#xff0c;很…...

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文件&#xff0c;应该是下载时出现问题&#xff0c;重复下载无法解决问题&#xff0c;只能重新安装brew。 步骤1&#xff08;安装 brew&#xff09;&#xff1a; /bin/zsh -c “$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/ra…...

记录一下gitlab社区版的安装教程

目录 1.更新系统软件包 2.安装必要的依赖 3.添加GitLab源 3.1对于GitLab Enterprise Edition&#xff08;EE&#xff09;&#xff1a; 3.2对于GitLab Community Edition&#xff08;CE&#xff09;&#xff1a; 4.安装GitLab 4.1安装GitLab Enterprise Edition&#xff08;E…...

20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?

在MyBatis中处理多表关联查询是一项常见的需求&#xff0c;特别是在关系型数据库中存储复杂的实体关系时。MyBatis提供了多种方式来实现多表关联查询&#xff0c;常见的实现方式包括使用<association>和<collection>标签在<resultMap>中进行对象关系映射&…...

【百日算法计划】:每日一题,见证成长(013)

题目 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 思路 找到中间节点反转后半部分链表前后链表顺序比…...

PCL 读取和保存点云

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 1.1原理 PCL (Point Cloud Library) 是…...

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】

js | TypeError: Cannot read properties of null (reading ‘indexOf’) 【解决】 描述 概述 在前端开发中&#xff0c;遇到TypeError: Cannot read properties of null (reading indexOf)这类错误并不罕见。这个错误通常表明你试图在一个null值上调用indexOf方法&#xff0c…...

微信小程序-formData使用

作者&#xff1a;fyupeng 技术专栏&#xff1a;☞ https://github.com/fyupeng 项目地址&#xff1a;☞ https://github.com/fyupeng/distributed-blog-system-api 留给读者 一、介绍 在小程序中使用formdata上传数据&#xff0c;可实现多文件上传 跟浏览器中的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扫描过程中&#xff0c;检测到mysql-connector-j:8.0.33存在如下高危安全漏洞&#xff1a; CVE-2023-22102&#xff1a;Oracle MySQL Connectors 8.1.0 版本之前存在安全漏洞&…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...