XML文件(超详细):XML文件概念、作用、写法、如何用程序解析XML、写入XML、dom4j框架、DTD文档、schema文档

news2024/11/23 11:08:12

目录

1、什么是XML文件?和properties属性文件有什么区别?和txt文本文件有什么区别?

2、XML文件的用途

3、XML的格式

4、如何解析XML文件

5、如何写入XML文件

6、约束XML的书写格式

6.1 DTD文档-约束书写格式,但是不能约束具体的数据类型

6.2 schema文档-约束书写格式,可以约束具体的数据类型


1、什么是XML文件?和properties属性文件有什么区别?和txt文本文件有什么区别?

XML(EXtensible Markup Lannguange,可扩展标记语言)

我们都知道txt文件,是一个普通的文本文件,里面的内容可以随便写,格式也很随意。所以我们读取里面有对应关系的数据需要挨个解析,较为麻烦。

而Properties的书写格式就有格式要求,文件内容都是一些键值对,方便我们去获取键值对里面的信息,例如账号密码等信息。

而XML文件则是存储复杂的数据结构和数据关系,本质是一种数据的格式。例如存储多个用户的用户名密码时,用Properties属性文件则显得乏力了。

来张图演示一下:

我上一篇详细解释properties属性文件的概念、作用、读取和写入方式,不清楚的同学可以先了解一下:

Properties文件:Properties属性文件键值对的获取方法、如何写入信息到Properties属性文件、Properties对象的用法-CSDN博客

2、XML文件的用途

1、作为系统的配置文件

2、作为一种特殊的数据结构,在网络中进行传输

举一个例子

我们在淘宝买东西,下单时填了收货地址。

顺丰快递平台收到你的订单信息,按照你的地址给你发货。

但是你是在淘宝下单的时候才填的地址,并没有去顺丰平台填地址。

所以这个地址信息就是淘宝平台通过XML文件形式封装好通过网络传输给顺丰平台的。

3、XML的格式:

注意一:<?xml version="1.0" encoding="utf-8" ?>这行是必须要写的,且必须放在首行(前面有注释都不行哦)。

表示版本为1.0,以utf-8字符集来编码

注意二:根标签只能有一个,子标签可以有多个

注意三:标签是成对存在的,记得嵌套正确

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

<!--Users是一个根标签,必须只能有一个,而Users里面的子属性可以有多个-->
<!--根标签名字随意取-->
<Users>
    <user id="1">
        <name>张三</name>
        <age>18</age>
        <address>广州</address>
    </user>
    <userAttribute>都是爱学习的人</userAttribute>
    <user id="2">
        <name>李四</name>
        <age>25</age>
        <address>哈尔滨</address>
    </user>

    <!--以下是带有大于号小于号等特殊字符的写法-->
    <special>
        <![CDATA[
        5 > 2 && 3 < 5
    ]]>
    </special>
    <!--特殊字符用法二-->
    <special>  5 &gt; 2 &amp;&amp; 3 &lt; 5 </special>
</Users>

XML文件可以在浏览器中查看,我们打开浏览器看到,我们写的特殊字符的格式是我们所预期的

语法规则:

4、如何解析XML文件?

对于文件的读取和解析,相信很多同学第一反应就是IO流。但是太过于繁琐啦,难度也较大!

所以我们建议使用Dom4j(第三方研发)框架来解析XML文件,方便且好用!

我是maven工程,直接引入依赖即可

   <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

 (需要解析的XML文件对象在本文第3点的格式样例中,同学们参照那个来。)

第一步:创建一个dom4j提供的解析器对象

第二步:将xml文件读取到我们的内存当中

第三步:xml文档信息已经解析到内存当中,我们可以操作这个文档信息了。

public class XMLRead {
    public static void main(String[] args) throws Exception {
        //创建一个dom4j提供的解析器对象
        SAXReader saxReader = new SAXReader();
        //将xml文件读取到我们的内存当中,获取到这个Document 对象之后就可以读取里面的数据了
        Document document = saxReader.read("src/main/resources/xmlConfigTest.xml");

        //1、获取根元素对象里面的所有信息,下面根据这个根元素对象去获取想要的数据
        Element rootElement = document.getRootElement();
        System.out.println(rootElement.getName());
        System.out.println("-----");

        //2、获取根元素里面的一级子元素
        List<Element> elements = rootElement.elements();
        for (Element element : elements){
            System.out.println(element.getName());
        }
        System.out.println("-----");
        
        //3、获取第一个user子元素里面的指定数据
        Element name = rootElement.element("user").element("name");
        System.out.println(name.getText());
        Element address = rootElement.element("user").element("address");
        System.out.println(address.getText());
        System.out.println("-----");

        //4、获取第一个user子元素里面的指定数据(方式二)
        Element firstUser = rootElement.element("user");
        System.out.println(firstUser.elementText("age"));
        System.out.println("-----");

        //5、获取含有特殊字符的第一个special属性数据
        Element special = rootElement.element("special");
        System.out.println(special.getTextTrim());


    }
}

可以对照代码里面的注释来看我们打印出来的日志,非常清晰明了,也非常简单好用!

5、如何写入XML文件

在实际应用中,我们不建议用domj4来把数据写到XML文件去,因为需要创建很多对象,非常繁琐。

建议直接把程序里的数据拼接成XML格式,然后用IO流写出去!

public class XMLWriter {
    public static void main(String[] args) throws IOException {

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n");
        stringBuilder.append("<School>\r\n");
        stringBuilder.append("\t<ClassRool>" + "北京大学" + "</ClassRool>\r\n");
        stringBuilder.append("\t<StudentNum>" +  "1000" + "</StudentNum>\r\n");
        stringBuilder.append("</School>\r\n");

        try (
                BufferedWriter bufferedWriter =
                        new BufferedWriter(new FileWriter("src/main/resources/xmlWriterTest.xml"))
        ) {
            bufferedWriter.write(stringBuilder.toString());
        }catch (Exception e){
            e.printStackTrace();
        }

    }
}

可以看到,我们将数据自己拼接成xml格式写入到了xml文件中。

6、约束XML的书写格式

我们解析XML文件格式时,应该要清楚原本的格式才能解析,所以我们需要给XML的书写格式进行约束,防止接收到的文件格式不正确而导致解析出错的情况。

做了约束之后,是不能随意更改XML书写格式的,这样方便接收方解析文件

6.1 DTD文档-约束书写格式,但是不能约束具体的数据类型

我直接截图黑马老师的课件给大家演示一下

6.2 schema文档-约束书写格式,可以约束具体的数据类型

我直接截图黑马老师的课件给大家演示一下

这就是我对XML文件相关知识的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!

后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过端口测试验证网络安全策略

基于网络安全需求&#xff0c;项目中的主机间可能会有不同的网络安全策略&#xff0c;这当然是好的&#xff0c;但很多时候&#xff0c;在解决网络安全问题的时候&#xff0c;同时引入了新的问题&#xff0c;如k8s集群必须在主机间开放udp端口&#xff0c;否则集群不能正常的运…

国产光耦合器的竞争优势与市场发展前景

国产光耦合器近年来在技术研发和市场表现上取得了显著进步&#xff0c;逐渐在国际市场中占据了一席之地。作为实现电气隔离和信号传输的核心器件&#xff0c;光耦合器在工业控制、通信设备、消费电子等领域中有着广泛的应用。国产光耦合器凭借其独特的成本、技术和市场优势&…

Wi-Fi 8标准已经发布,准备好了吗

今年初&#xff0c;Wi-Fi联盟宣布完成并推出了Wi-Fi 7高级无线标准的认证&#xff0c;将改善家庭、办公室和工业用途设备的连接性能&#xff0c;同时还带来了新的认证标志。其在Wi-Fi 6E的基础上引入了320MHz信道带宽、4096-QAM调制、Multi-RU、多链路操作、增强MU-MIMO、多AP协…

STM32F407ZGT6驱动TCA9535扩展16路IO

目录 一、TCA9535 I/O 扩展器1、TCA9535 的 I2C 地址2、TCA9535 的读写操作3、TCA9535 的控制寄存器4、输入寄存器 0/15、输出寄存器 0/16、极性反转寄存器 0/17、配置寄存器 0/1 二、硬件设计1、接线说明2、硬件参考 三、程序设计1、tca9535_softiic.c2、tca9535_softiic.h3、…

一分钟学习数据安全——数据安全风险的系统化应对思路

数据是组织的重要资产&#xff0c;未经授权的数据访问可能导致数据泄露、数据篡改、隐私侵犯和合规风险等问题。企业可以通过数据访问控制来提高信息系统在数据全生命周期管理中的安全性。企业可以引入IAM系统&#xff0c;来控制身份来管理权限。通过对用户访问权限的管理和合适…

空间计算、物理计算、实时仿真与创造拥有「自主行为」的小狗 | 播客《编码人声》

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 虚拟世界与现实世界的界限逐渐模糊&#xff0c;已然成为不争的事实。但究竟哪些曾经的幻想已然…

shell脚本(三)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言 之前写了 Requests 自动重试的文章&#xff0c;突然想到&#xff0c;之前还用到过 Requests 自动加解密请求的逻辑&#xff0c;分享一下。之前在做逆向的时候&#xff0c;发现一般医院的小程序请求会这么玩&#xff0c;请求数据可能加密也可能不加密&#xff0c;但是返回…

基于Springboot+Vue的救灾物资调动系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

『 Linux 』网络层 - IP协议(一)

文章目录 IP协议报文格式IP协议报文如何进行报头与有效载荷分离 网段划分CIDR特殊的IP地址 IP地址的数量限制私有IP和公网IP理解运营商 IP协议报文格式 IP协议报文格式与TCP协议的报文格式类似; IP报文的宽度也是32位; 对应的IP的实际报头为20字节为定长报头(固定长度); 版本 …

[cg] vulkan external_memory

最近在写硬件编码的代码&#xff0c;渲染器渲染出的RT需要给到编码器做硬编&#xff0c;有两种方法能做。 一是通过 map的方式&#xff0c;把显存里的数据读到cpu&#xff0c;拷贝一份cpu data给编码器&#xff0c;但这种方式会有内存拷贝的开销。所以&#xff0c;我们思考是否…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章…

# issue 4 进程控制函数

目录 一、进程控制函数一 二、进程控制函数二 启动进程&#xff1a;&#xff08;exec系列&#xff09; 创建新进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 三、进程控制函数三 结束进程&#xff1a; 测试代码&#xff1a; 测试结果&#xff1a; 四、…

Linux|进程程序替换

目录 什么是进程替换 替换原理 exec函数 exec* 函数的共性 什么是进程替换 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程&#xff0c;但替换不是创建新进程&#xff0c;只是将对应程序的代码和数据进行替换。具体来说&#xff0c;这个替换过程涉…

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)

在当下&#xff0c; 日益发展的时代&#xff0c;宠物的数量应该均为稳步上升&#xff0c;在美国出现了下降的趋势&#xff0c; 中国 2019-2020 年也下降&#xff0c;这部分变化可能与疫情相关。需要对该部分进行必要的解释说明。 问题 1: 基于附件 1 中的数据及您的团队收集的…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

【从零开始的LeetCode-算法】3233. 统计不是特殊数字的数字数量

给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数字。例如&#xff1a; 数字 4 是 特殊数字&#xff0c;因为它的真因数为 1 和…

web——sqliabs靶场——第十二关——(基于错误的双引号 POST 型字符型变形的注入)

判断注入类型 a OR 1 1# 发现没有报错 &#xff0c;说明单引号不是闭合类型 测试别的注入条件 a) OR 1 1# a)) OR 1 1# a" OR 11 发现可以用双引号闭合 发现是")闭合 之后的流程还是与11关一样 爆破显示位 先抓包 是post传参&#xff0c;用hackbar来传参 unam…

IDEA 下载源码很慢,Download Source使用阿里云镜像仓库

参考&#xff1a; IDEA maven本地仓库、中心仓库、远程仓库配置 在观看第三方jar包的api时&#xff0c;有时候需要下载源码看下注释。 这个时候用idea 上的提示的Download Source会发现一直下载不下来。 因此就怀疑用的是apache的maven仓库&#xff0c;不是我们用的 aliyun 镜…

1+X应急响应(网络)病毒与木马的处置:

病毒与木马的处置&#xff1a; 病毒与木马的简介&#xff1a; 病毒和木马的排查与恢复&#xff1a;