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

目录

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

2、XML文件的用途

3、XML的格式

4、如何解析XML文件

5、如何写入XML文件

6、约束XML的书写格式

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

[6.2 schema文档-约束书写格式,可以约束具体的数据类型](#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 复制代码
<?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工程,直接引入依赖即可

XML 复制代码
   <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

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

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

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

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

java 复制代码
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流写出去!

java 复制代码
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文件相关知识的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!

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

相关推荐
漫漫进阶路2 小时前
VS C++ 配置OPENCV环境
开发语言·c++·opencv
陈平安Java and C2 小时前
MyBatisPlus
java
秋野酱3 小时前
如何在 Spring Boot 中实现自定义属性
java·数据库·spring boot
安的列斯凯奇3 小时前
SpringBoot篇 单元测试 理论篇
spring boot·后端·单元测试
Bunny02123 小时前
SpringMVC笔记
java·redis·笔记
架构文摘JGWZ4 小时前
FastJson很快,有什么用?
后端·学习
BinaryBardC4 小时前
Swift语言的网络编程
开发语言·后端·golang
feng_blog66884 小时前
【docker-1】快速入门docker
java·docker·eureka
code_shenbing4 小时前
基于 WPF 平台使用纯 C# 制作流体动画
开发语言·c#·wpf
邓熙榆4 小时前
Haskell语言的正则表达式
开发语言·后端·golang