补漏之XML配置文件基本使用

Posted 'or 1 or 不正经の泡泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补漏之XML配置文件基本使用相关的知识,希望对你有一定的参考价值。


theme: channing-cyan
highlight: androidstudio

文章目录

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

前言

差不多寒假要结束了,先补个漏,为后面的源码学习铺路,Letcode我是没想到的,我还以为这个寒假我能刷个300道题目来着的,高估了…简单题没意思,难题有的很偏那个做起来可能半个上午,一个上午就没了,我是想明白了,有这个时间,不如把dp 回溯,分治,递归,贪心,字符串匹配算法kmp,sunday,树,map,各种“数”的问题等等重新过几遍,然后刷蓝桥杯去。

那么今天主要是把以前欠下的内容补回来,主要还是针对java web 的内容,我是直接从python Django跳过来的,一来就玩spring mybatis,然后玩springboot mvc(web-starter) 所以什么Tomcat,servelet我直接跳过来的,现在后面得去看看源码,这个部分的内容我是得去看看的,其实我感觉也没啥,当初python 一来玩的是nginx,uwgc 其实一样,无非是看几个api,省的我到时候debug去查文档。回去之后,边看源码边准备各种比赛,分布式,面试。然后大三专心准备考研。

基本的XML结构


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

<students>
    <student id="001">
        <name>小明</name>
        <age>15</age>
        <sex></sex>
    </student>
    
    <student id="002">
        <name>小刚</name>
        <age>15</age>
        <sex></sex>
    </student>
</students>

直接看这个结构其实非常简单。如果学习过html的话,你会发现其实这个xml和html很像,其实这个xml就是html的弟弟。我们可以直接通过标签去定义我们的一些属性,一些值。

格式

对于xml的格式的话基本上和HTML一样注意闭合即可,我们可以按照自己的意愿去定义任意一个xml文件,使得它具备存储数据的能力,你唯一需要注意的就是,注意头部

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

这个一定要加在第一行

之后是最外层标签,这个最外层标签类似于<body>标签,一个文件只能有一个。

CDATA 域

这个是我们xml文件需要注意的第二点,就是如果我们想要随意书写一些数据的话,同时这些数据含有特殊符号的话,你需要将它放在这里面。


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

<students>
    <student id="001">
        <name>小明</name>
        <age>15</age>
        <sex></sex>
        <code> <![CDATA[
                you code
        ]]>
        </code>
    </student>
    

</students>

这个就是在单纯的xml文件里面我们需要注意的点,但是这个并不够,因为我们此时定义的标签是我们自己定义的,根本就没有统一,如果你的程序想要让别人编写一下xml文件的话,例如spring的配置文件,如果你想让你别人按照你的规则来书写xml文件,然后在将来推出你自己的框架的话。

xml 约束

这个其实就是定义一下如何书写你定义的xml文件,例如我们前面定义了,这样的XML文件


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

<students>
    <student id="001">
        <name>小明</name>
        <age>15</age>
        <sex></sex>
    </student>
    
    <student id="002">
        <name>小刚</name>
        <age>15</age>
        <sex></sex>
    </student>
</students>

如何让别人也能够按照这样的格式去书写XML文件。

所以为了实现这个功能,我们这里引入了约束这种东西,我们这样介绍两种约束。

DTD 约束

这个是第一个约束,也是最简单的约束
你只需要定义你的标签和格式就行了。

Student.dtd文件


<!ELEMENT students (student *)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student id ID #REQUIRED>

首先我们定义了一个元素 students 这个是最外层的元素
然后这个元素包含了student
student 又包含了name age sex
name age sex 分别是什么类型
之后定义了一个student元素的id 这个id和html的id是一个意思。

之后我们引入就行了。

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM "Student.dtd">
<students >
    <student id="001">
        <name>小明</name>
        <age>15</age>
        <sex></sex>
    </student>
</students>

这个时候别在编写文件的时候就会按照你的格式去编写了,idea直接给你提示。

Schema 约束

这个约束可以实现比较复杂的约束,当然结构其实和dtd是类似的,但是要复杂一点看起来。同时这个约束也是项目里面经常见到的。

生明

我们先来看看一个标准的文件长啥样吧

<?xml version="1.0"?>

<xs:schema xmlns:xs="http://www.w3.org/2021/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
      <xs:sequence>
	<xs:element name="to" type="xs:string"/>
	<xs:element name="from" type="xs:string"/>
	<xs:element name="heading" type="xs:string"/>
	<xs:element name="body" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
</xs:element>
    
</xs:schema>
xmlns:xs="http://www.w3.org/2001/XMLSchema"

显示 schema 中用到的元素和数据类型来自命名空间 http://www.w3.org/2021/XMLSchema。同时它还规定了来自命名空间
http://www.w3.org/2021/XMLSchema” 的元素和数据类型应该使用前缀 xs:

targetNamespace="http://www.w3school.com.cn"

显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: “http://www.w3school.com.cn”。

xmlns="http://www.w3school.com.cn"

指出默认的命名空间是"http://www.w3school.com.cn"

elementFormDefault="qualified"

指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。

引用

这里的话回到我们具体的例子,
我们现在把我们的dtd改成schema

Student.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<myxsd:schema xmlns:myxsd="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3school.com.cn"
           xmlns="http://www.w3school.com.cn"
           elementFormDefault="qualified">

    <myxsd:element name="students" type="studentsType">
    </myxsd:element>

    <myxsd:complexType name="studentsType">
        <myxsd:sequence>
            <myxsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded">

            </myxsd:element>
        </myxsd:sequence>
    </myxsd:complexType>

    <myxsd:complexType name="studentType">
        <myxsd:sequence>
            <myxsd:element name="name" type="nameType"/>
            <myxsd:element name="age" type="ageType"/>
            <myxsd:element name="sex" type="sexType"/>
        </myxsd:sequence>
        <myxsd:attribute name="id" type="idType" use="required"/>
    </myxsd:complexType>

    <myxsd:simpleType name="nameType">
        <myxsd:restriction base="myxsd:string">

        </myxsd:restriction>
    </myxsd:simpleType>

    <myxsd:simpleType name="ageType">
        <myxsd:restriction base="myxsd:int">
            <myxsd:minInclusive value="0"/>
            <myxsd:maxInclusive value="256"/>
        </myxsd:restriction>
    </myxsd:simpleType>

    <myxsd:simpleType name="sexType">
        <myxsd:restriction base="myxsd:string">
            <myxsd:enumeration value=""/>
            <myxsd:enumeration value=""/>
        </myxsd:restriction>
    </myxsd:simpleType>

    <myxsd:simpleType name="idType">
        <myxsd:restriction base="myxsd:string"/>
    </myxsd:simpleType>

</myxsd:schema>

使用就是

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

<students xmlns="http://www.w3school.com.cn">
    <student id="001">
        <name>小明</name>
        <age>15</age>
        <sex></sex>
    </student>
</students>

如果你还有引用的话你就可以使用命名空间把他们区分开来


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

<my:students xmlns:my="http://www.w3school.com.cn">
    <my:student id="001">
        <my:name>小明</my:name>
        <my:age>15</my:age>
        <my:sex></my:sex>
    </my:student>
</my:students>

这个使用是比较灵活的,看你具体的情况。

这里注意如果你嫌麻烦的话

这个 xsd 文件开头你可以直接抄

<myxsd:schema xmlns:myxsd="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3school.com.cn"
           xmlns="http://www.w3school.com.cn"
           elementFormDefault="qualified">
           ```
</myxsd:schema>

引用的话也是idea有提示

就非常方便

XML 解析

现在我们已经大概熟悉了xml文件的构造和编写约束了,那么现在我们应该考虑如何拿到我们的数据了。

这个解析的话有两种方式一种就是基于DOM操作的解析,这个可以实现对DOM的操作,还有一种是SAX 这个呢是逐行读取,是只能读取不能修改。

我们这里实现的话就是直接使用Jsoup就行了,因为那个xml也是一个标签语言嘛,也是可以解析的,而且好像这个还是java爬虫的html解析库,这个我就不太清楚了,我玩python 的话一般是使用lxml解析,直接使用css选择器,这个也是类似dom操作的,还有就是直接用正则表达式,至于“beautifulsoup”那玩意慢地要死,而且api还不好记,还不如正则,不如lxml。

Jsoup

我们下载好jar包,然后放在项目里面就行了,或者直接创建maven工程,导入官方配置文件。

这个jsoup其实操作还是很简单的。就两步,第一找到你的文件位置,第二解析,其他的步骤就是调用api,这个看编辑器的提示基本上就能coding。

public class JsoupDome1 
    public static void main(String[] args) throws IOException 
        String path = Objects.requireNonNull(JsoupDome1.class.getResource("XML-Resource/Student.xml")).getPath();
        Document parse = Jsoup.parse(new File(path), "utf-8");

        Elements names = parse.getElementsByTag("name");
        if(names.size()>0)
            Element element = names.get(0);
            System.out.println(element.text());
        

    

这样我就提取出了第一个元素。

现在我拿到学生的信息

public class JsoupDome1 
    public static void main(String[] args) throws IOException 
        String path = Objects.requireNonNull(JsoupDome1.class.getResource("XML-Resource/Student.xml")).getPath();
        Document parse = Jsoup.parse(new File(path), "utf-8");

        Element xiaoming = parse.getElementById("001");

        Elements children = xiaoming.children();
        for(int i=0;i<children.size();i++)
            System.out.println(children.get(i).nodeName()+":"+children.get(i).text());
        

    

可以看到非常简单就实现了这样的功能。
所以后面我们完全自己结合反射,注解自己实现一套IOC容器便于自己的项目管理。

其他的话,非常简单,可以直接去看文档,或者直接在idea里面去“点”一下看看,看看API的名字,然后看看源码就知道了。

这里我们使用jsoup,后面还方便curd xml文件,这样可以实现注解注入,还是很方便的。
说到这里真不得不说,python就是个老流氓,一个setting.py把一堆事情全部干完了,看看django项目源码比spring项目爽太多了。

以上是关于补漏之XML配置文件基本使用的主要内容,如果未能解决你的问题,请参考以下文章

Maven的pom.xml文件结构之基本配置parent和继承结构

Maven的pom.xml文件结构之基本配置parent和继承结构[转]

Maven的pom.xml文件结构之基本配置packaging和多模块聚合结构(微服务)

maven之pom.xml文件配置

基础补漏之Maven项目管理

小玩意儿之Gitlab 代码提交日志同步到禅道项目管理系统