15-基础加强-2-xml(约束)枚举注解
文章目录
- 1.xml
- 1.1概述【理解】(不用看)
- 1.2标签的规则【应用】
- 1.3语法规则【应用】
- 1.4xml解析【应用】
- 1.5DTD约束【理解】
- 1.5.1 引入DTD约束的三种方法
- 1.5.2 DTD语法(会阅读,然后根据约束来写)
- 1.6 schema约束【理解】
- 1.6.1 编写schema约束
- 1.6.2 引入schema约束
properties文件变量名指定定义一个,多个对象全路径名时不方便阅读
xml就方便许多了,对配置有自己的一套语法格式,很健全,很强大实用
1.xml
1.1概述【理解】(不用看)
-
万维网联盟(W3C)
万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。
建立者: Tim Berners-Lee (蒂姆·伯纳斯·李)。
是Web技术领域最具权威和影响力的国际中立性技术标准机构。
到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,-
如广为业界采用的超文本标记语言HTML(标准通用标记语言下的一个应用)、
-
可扩展标记语言XML(标准通用标记语言下的一个子集)
-
以及帮助残障人士有效获得Web信息的无障碍指南(WCAG)等
-

-
xml概述
XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言
标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)
可扩展:标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 -
作用
- 用于进行存储数据和传输数据
- 作为软件的配置文件
-
作为配置文件的优势
- 可读性好
- 可维护性高
1.2标签的规则【应用】
-
标签由一对尖括号和合法标识符组成
<student> -
标签必须成对出现
<student> </student> 前边的是开始标签,后边的是结束标签 -
特殊的标签可以不成对,但是必须有结束标记
<address/> -
标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
<student id="1"> </student> -
标签需要正确的嵌套
这是正确的: <student id="1"> <name>张三</name> </student> 这是错误的: <student id="1"><name>张三</student></name>
1.3语法规则【应用】
-
语法规则
-
XML文件的后缀名为:xml
-
文档声明必须是第一行第一列
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>version:该属性是必须存在的 (值也固定1.0吧 不要写别的)
encoding:该属性不是必须的 打开当前xml文件的时候应该是使用什么字符编码表(一般取值都是UTF-8)
standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no
-
必须存在一个根标签,有且只能有一个
-
XML文件中可以定义注释信息
-
XML文件中可以存在以下特殊字符
< < 小于 > > 大于 & & 和号 ' ' 单引号 " " 引号 -
XML文件中可以存在CDATA区
<![CDATA[ …内容… ]]>
-
-
示例代码
<?xml version="1.0" encoding="UTF-8" ?>
<!--文档声明必须第一行第一列 上面连空格 空行都不能有--><students> <!--根标签 有且只能有一个--><!--学生1 通过id区分是哪个学生--><student id="1"><name>张三</name><age>23</age><info>张三信息[特殊字符:小于:< 大于:> 且:& 单引号:' 双引号:"]</info><message><![CDATA[直接用CDATA域: 这里的所有东西都当做简简单单的文本,不会被转义 < > & ' "]]></message></student><!--学生2 id=2--><student id="2"><name>李四</name><age>24</age></student></students>
1.4xml解析【应用】
-
概述
xml解析就是从xml中获取到数据
-
常见的解析思想
DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看做成对应的对象。
会把xml文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oP971TUR-1676788762135)(.\img\02_dom解析概述.png)]](https://img-blog.csdnimg.cn/5b3a188b62da402999dcf9d0d94223d9.png)
-
常见的解析工具
- JAXP: SUN公司提供的一套XML的解析的API
- JDOM: 开源组织提供了一套XML的解析的API-jdom
- DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java
- pull: 主要应用在Android手机端解析XML
-
解析的准备工作
-
我们可以通过网站:https://dom4j.github.io/ 去下载dom4j
今天的资料中已经提供,我们不用再单独下载了,直接使用即可
-
将提供好的dom4j-1.6.1.zip解压,找到里面的dom4j-1.6.1.jar
-
在idea中当前模块下新建一个libs文件夹,将jar包复制到文件夹中
-
选中jar包 -> 右键 -> 选择add as library即可
-
-
需求
- 解析提供好的xml文件
- 将解析到的数据封装到学生对象中
- 并将学生对象存储到ArrayList集合中
- 遍历集合
-
代码实现
注意,新建目录,复制好jar包之后得,右键导入一下才能使用

导入成功后就可以展开了

- student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students> <!--学生1 通过id区分是哪个学生--><student id="1"><name>张三</name><age>23</age></student><!--学生2 id=2--><student id="2"><name>李四</name><age>24</age></student>
</students>
- Student.java
public class Student {private String id;private String name;private int age;//全参构造,无参构造,set/get, toString\
}
- XmlParse.java
/*** 利用dom4j解析xml文件*/
public class XmlParse {public static void main(String[] args) throws Exception {//1.获取Document对象//1.1先得获取一个解析器对象(SAXReader)SAXReader saxReader = new SAXReader();//1.2利用解析器把xml文件加载到内存中,并返回一个文档对象(Document对象)Document document = saxReader.read(new File("myxml/xml/student.xml"));//2.逐步获取标签对象//2.1 获取根标签Element rootElement = document.getRootElement();//2.2 通过根标签获取Student标签//方法1:elements(),返回调用者所有子标签,放在一个List中/*List list = rootElement.elements();System.out.println(list.size());//3 不仅<student>,连<aaa>也都获取到了*///方法2:★ elements("标签名"),返回调用者所有指定名称子标签,放在一个List中/*List list = rootElement.elements("student");System.out.println(list.size());//2 只有所有<student>了*/List<Element> studentElements = rootElement.elements("student");//用来装学生对象ArrayList<Student> list = new ArrayList<>();//2.3 遍历集合得每一个student标签for (Element studentElement : studentElements) {// 2.4 继续读取每一个student子标签以及属性//2.4.1 获取id属性,以及其值Attribute attribute = studentElement.attribute("id");//获取id属性String id = attribute.getValue();//获取id属性值//2.4.2 获取各个子标签 以及其值(标签体内容)//element("标签名"): 获取调用者指定子标签(单个)Element nameElement = studentElement.element("name");//name标签String name = nameElement.getText();//name标签体内容(需要的值)Element ageElement = studentElement.element("age");String age = ageElement.getText();//3. 最后根据获取到的值 封装对象了//System.out.println(id+" "+name+" "+age);Student stu = new Student(id, name, Integer.parseInt(age));list.add(stu);}System.out.println(list);}}

1.5DTD约束【理解】
-
什么是约束
用来限定xml文件中可使用的标签以及属性
-
约束的分类
- DTD
- schema
-
编写DTD约束
-
步骤
-
创建一个文件,这个文件的后缀名为.dtd
-
看xml文件中使用了哪些元素
<!ELEMENT> 可以定义元素 -
判断元素是简单元素还是复杂元素
简单元素:没有子元素。
复杂元素:有子元素的元素;
-
-
代码实现
-
- persondtd.dtd
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
- person.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons SYSTEM 'persondtd.dtd'>
<!--persons根标签 SYSTEM表示引入本地约束--><!--引入之后再编写也有提示了-->
<persons><person><name>张三</name><age>18</age></person>
</persons>
1.5.1 引入DTD约束的三种方法
- 引入本地dtd
<!DOCTYPE 根元素名称 SYSTEM ‘DTD文件的路径'>
- 在xml文件内部引入
<!DOCTYPE 根元素名称 [ dtd文件内容 ]>
- 引入网络dtd
<!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">
-
代码实现
-
引入本地DTD约束
<!DOCTYPE 根元素名称 SYSTEM ‘DTD文件的路径'>persondtd.dtd
<!ELEMENT persons (person)> <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>person1.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE persons SYSTEM 'persondtd.dtd'> <!--方法1:引入本地约束--><persons><person><name>张三</name><age>18</age></person> </persons> -
在xml文件内部引入
<!DOCTYPE 根元素名称 [ dtd文件内容 ]>person2.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE persons [<!ELEMENT persons (person)><!ELEMENT person (name,age)><!ELEMENT name (#PCDATA)><!ELEMENT age (#PCDATA)>]> <!--方法2:xml文件内部引入约束--><persons><person><name>张三</name><age>18</age></person> </persons> -
引入网络dtd
<!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">暂时了解 后面使用
-
1.5.2 DTD语法(会阅读,然后根据约束来写)
-
定义元素
定义一个元素的格式为:<!ELEMENT 元素名 元素类型>
简单元素: EMPTY: 表示标签体为空
ANY: 表示标签体可以为空也可以不为空
PCDATA: 表示该元素的内容部分为字符串
复杂元素:
直接写子元素名称. 多个子元素可以使用",“或者”|"隔开;
","表示定义子元素的顺序 ; “|”: 表示子元素只能出现任意一个
"?"零次或一次, "+"一次或多次, "*"零次或多次;如果不写则表示出现一次![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VLD3cCeg-1676796640554)(.\img\03_DTD语法定义元素.png)]](https://img-blog.csdnimg.cn/0ebbd736674c48d08adf10eb7fc9dddb.png)
不限制个数,就是只能写一次 -
定义属性
格式
定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
属性的类型:
CDATA类型:普通的字符串属性的约束:
// #REQUIRED: 必须的
// #IMPLIED: 属性不是必需的
// #FIXED value:属性值是固定的 -
代码实现
-
代码实现
<!ELEMENT persons (person+)> <!--person+ 1个或多个 person 只能写一个--> <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ATTLIST person id CDATA #REQUIRED> <!ATTLIST name id CDATA #FIXED "p1"> <!-- 属性值定死为name了 --><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE persons SYSTEM 'persondtd.dtd'><persons><person id="001"><name>张三</name><age>23</age></person><person id = "002"><name>张三</name><age>23</age></person></persons>
1.6 schema约束【理解】
-
schema和dtd的区别
- schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
- 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
- dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
- schema 语法更加的复杂
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1FtCyDj-1676797603638)(.\img\04_schema约束介绍.png)]](https://img-blog.csdnimg.cn/c9b88c943ce8453b8c03ed0c0ede4969.png)
1.6.1 编写schema约束
-
步骤
1,创建一个文件,这个文件的后缀名为.xsd。
2,定义文档声明
3,schema文件的根标签为:<schema>
4,在<schema>中定义属性:
xmlns=http://www.w3.org/2001/XMLSchema
5,在<schema>中定义属性 :
targetNamespace =唯一的url地址,指定当前这个schema文件的名称空间。
6,在<schema>中定义属性 :
elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件。
7,通过element定义元素
8,判断当前元素是简单元素还是复杂元素![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rmgpmrHZ-1676797603638)(.\img\05_schema约束编写.png)]](https://img-blog.csdnimg.cn/b892de4d7a4b4fd7a1f04e74bf6eb3b4.png)
-
代码实现
-
person.xsd
<?xml version="1.0" encoding="UTF-8" ?> <!--根标签有三个固定属性--> <schemaxmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.whu.cn/javase"elementFormDefault="qualified" ><!--定义persons复杂元素--><element name="persons"><complexType><!--sequence表示子标签必须按顺序来--><sequence><!--定义person复杂元素--><element name="person"><complexType><sequence><!--定义name和age简单元素--><element name="name" type="string"></element><element name="age" type="string"></element></sequence></complexType></element></sequence></complexType></element></schema>
-
1.6.2 引入schema约束
-
步骤
1,在根标签上定义属性xmlns=“http://www.w3.org/2001/XMLSchema-instance”
2,通过xmlns引入约束文件的名称空间
3,给某一个xmlns属性添加一个标识,用于区分不同的名称空间
格式为: xmlns:标识=“名称空间地址” ,标识可以是任意的,但是一般取值都是xsi
4,通过xsi:schemaLocation指定名称空间所对应的约束文件路径
格式为:xsi:schemaLocation = "名称空间url 文件路径“ -
代码实现
相关文章:
15-基础加强-2-xml(约束)枚举注解
文章目录1.xml1.1概述【理解】(不用看)1.2标签的规则【应用】1.3语法规则【应用】1.4xml解析【应用】1.5DTD约束【理解】1.5.1 引入DTD约束的三种方法1.5.2 DTD语法(会阅读,然后根据约束来写)1.6 schema约束【理解】1.6.1 编写schema约束1.6.…...
13:高级篇 - CTK 事件管理机制(signal/slot)
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在《12:高级篇 - CTK 事件管理机制(sendEvent/postEvent)》一文中,我们介绍了如何进行插件间通信 - sendEvent()/postEvent() + ctkEventHandler。然而,除了这种方式之外,EventAdmin 还提供了另一种方…...
群晖-第1章-IPV6的DDNS
群晖-第1章-IPV6的DDNS 方案:腾讯云群晖DS920 本文参考群晖ipv6 DDNS-go教程-牧野狂歌,感谢原作者的分享。 这篇文章只记录了我需要的部分,其他的可以查看原文,原文还记录了更多的内容,可能帮到你。 一、购买域名 …...
centos7系统-kubeadm安装k8s集群(v1.26版本)亲测有效,解决各种坑可供参考
文章目录硬件要求可省略的步骤配置虚拟机ip设置阿里镜像源各服务器初始化配置配置主节点的主机名称配置从节点的主机名称配置各节点的Host文件关闭各节点的防火墙关闭selinux永久禁用各节点的交换分区同步各节点的时间将桥接的IPv4流量传递到iptables的链(三台都执行…...
帮助指令 man ,help及文档常用管理指令
帮助指令 man,help 1. man 当我们想要了解某个命令如何使用,及选项的含义是什么以及配置文件的帮助信息时,可以使用 man [命令或配置文件],这样便可以获得到帮助提示信息了。 语法格式:man [命令或者配置文件] 比如…...
电子科技大学操作系统期末复习笔记(五):文件管理
目录 前言 文件管理:基础 基本概念 文件 文件系统 文件系统的实现模型 文件的组成 文件名 文件分类 文件结构 逻辑结构 物理结构 练习题 文件管理:目录 文件控制块FCB FCB:File Control Block FCB信息 目录 基本概念 目…...
SpringBoot+ActiveMQ-发布订阅模式(生产端)
SpringBootActiveMQ-发布订阅模式(生产端)Topic 主题* 消息消费者(订阅方式)消费该消息* 消费生产者将发布到topic中,同时有多个消息消费者(订阅)消费该消息* 这种方式和点对点方式不同…...
Android实例仿真之三
目录 四 Android架构探究 五 大骨架仿真 六 Android实例分析思路拓展 四 Android架构探究 首先,Android系统所带来的好处,就在于它本身代码的开放性,这提供了一个学习、借鉴的平台。这对分析仿真而言,本身就是一大利好…...
关于MySQL的limit优化
1、前提 提示:只适用于InnoDB引擎 2、InnoDB存储特点 它把索引和数据放在了一个文件中,就是聚集索引。这与MyISAM引擎是不一样的。 3、SQL示例 -- 给cve字段建立索引 select * from cnnvd where cveCVE-2022-24808 limit 300000,10;由于M…...
Java-Stream流基本使用
collection.stream将会破坏原有的数据结构,可以通过collect方法收集,可以用Collectors提供的构造器,add等方法构造形成新的数据结构。 HashSet<List<Integer>> rs new HashSet<>(); rs.stream().toList();Collection集合转…...
Liunx(狂神课堂笔记)
一.常用命令 1. cd 切换目录 cd ./* 当前目录cd /* 绝对路径cd .. 返回上一级目录cd ~ 回到当前目录pwd …...
【史上最全面esp32教程】点灯大师篇
文章目录前言ESP32简介认识arduino的两个函数点灯步骤函数介绍LED灯闪烁流水灯总结前言 esp32有很多的功能,例如wifi,蓝牙等,这节我们学习最简单的点灯。 提示:以下是本篇文章正文内容,下面案例可供参考 ESP32简介 …...
【Java 面试合集】内存中为什么要区分栈和堆
内存中为什么要区分栈和堆 1. 概述 嗨,大家好Java 面试合集又来了,今天我们分享的主题很大众化以及普通。无论是Java 语言本身还是别的语言都会有所涉及,但是今天我们从Java角度来讲下 2. 分析 今天我们会从多个方向来分享这个话题 2.1 栈是…...
【NLP实战】Python字符串处理
一、Python字符串基本操作 1. 去掉前后的特殊字符(strip) Python的strip操作可以去除字符串前后的空格(不改变原串)下例将前后的空格均删掉👇 str 人工智能 str.strip() # OUT:人工智能rstrip删除右边的空格&a…...
17.CSS伪类
举一个简单的例子来说明什么是伪类? 从之前的代码中,如下图,我们像给这两个列表中的某一列单独设置样式,我们该如何做呢? 我们肯定会选择在li标签上添加class去实现,如下 开始标记结束标记实际元素 <…...
数据链路层
一.以太网数据链路层考虑的是相邻两个节点(通过网线/光纤、无线直接相连的两个设备)之间的传输,这里的典型协议中最知名的就是“以太网”这个协议了数据链路层,也规定了物理层的内容以太网帧格式:IP地址用来描述整个传…...
投票需要什么流程微信投票互助平台的免费投票平台搭建
“最美家政人”网络评选投票_免费小程序投票推广_小程序投票平台好处手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票小程序能够提高工作效…...
数据结构——算法的时间复杂度
🌇个人主页:_麦麦_ 📚今日名言:生命中曾经有过的所有灿烂,都终究需要用寂寞来偿还。——《百年孤独》 目录 一、前言 二、正文 1.算法效率 1.1如何衡量一个算法的好坏 1.2算法的复杂度 2. 时间复杂度 2.1时间复杂度的…...
Go基础-类型
文章目录1 bool2 有符号整数3 无符号整数4 浮点数5 复数6 string7 关于类型转型1 bool bool类型有两个值,一个是true,一个是false。 测试 package mainimport "fmt"func main() {a : trueb : falsec : a && bd : a || bfmt.Println(a…...
良许翻天覆地的2022年
大家好,我是良许,新年快乐呀~ 在我女室友坚持不懈的努力之下,2022年的最后一天我终于被她传染了,阳了~ 此时的我,正顶着37多度的低烧写下这篇年终总结。 2022年,对于大多数人而言,封控是主旋…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
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…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx
“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网(IIoT)场景中,结合 DDS(Data Distribution Service) 和 Rx(Reactive Extensions) 技术,实现 …...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
