1.XML的介绍
XML是可扩展的标记语言。
XML的标签没有被预定义,也就说不是固定的,用户可以根据自身的需要去定义标签。
XML的作用主要是用来存储数据和传输数据
存储数据是用来存储有层级关系,例如省市区,在java领域XML的使用主要是作为框架的配置文件
1.spring framework application.xml
2.mybatis mybatis.xml
3.log4j2 log4j2.xml
传输数据指的是服务提供方返回个服务调用方的数据传输格式,目前主流的数据传输格式为json。
XML目前的版本是1.0

2.XML的元素组成
编写XML文件,可以写哪些内容?

  • 文档声明
<?xml version="1.0" encoding="UTF-8"   ?>

XML的文档声明是可选的,也就是可以不写,但是开发中为了规范都会写文档声明。
XML的文档声明如果写了,它必须放在XML文件的第一行第一列,必须以<?xml开头,和?>结尾,而且必须包含二个属性:version和encoding。
1.version 表示XML的版本号
2.encoding表示XML编码,一般写UTF-8

  • 元素(标签)
    元素是XML的重要组成部分,元素也被称为标签。
    每个XML文件必须要有一个根标签。
    标签由开始标签和结束标签组成,中间可以写标签,也可以写文本字符串。
    标签可以嵌套使用,必须明确层级的嵌套关系
    标签名必须遵守命名的规则和规范
    1.标签名不能以数字开头
    2.不能使用空格和冒号
    3.不能使用xml,XML
    4.命名区分大小写
<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user>
        <id>1001</id>
        <name>admin</name>
        <password>12345</password>
    </user>
    <user>
        <id>1002</id>
        <name>jack</name>
        <password>6666</password>
    </user>


</users>
  • 属性
    属性是标签(元素)的组成部分,属性只能是定义在开始标签中,
    属性的定义格式,属性名=属性值,属性值需要使用双引号包含起来。
    开始标签中可以定义多个属性,但是多个属性的属性名不能相同。
    属性名和标签名一样,也要遵守命名规则和规范。
<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1001" country="china" source="android">
        <id>1001</id>
        <name>admin</name>
        <password>12345</password>
    </user>
    <user id="1002" country="china" source="iso">
        <id>1002</id>
        <name>jack</name>
        <password>6666</password>
    </user>


</users>
  • 注解
    注释就是对xml标签的说明
    快捷键:Ctrl+/
<!--注释对xml文件的说明-->
  • 转义字符
    在xml中有些字符是无法识别的,此时就需要使用xml的转义符来表示。
    例如:&使用 &amp ; 来表示
    < 使用 &lt ; 来表示
  • 字符区
    CDATA内部所有的内容都会当做文本解析,使用字符区解决xml中有些字符无法识别的问题。
    IDEA中CDATA中的快捷键是CD+回车。
<?xml version="1.0" encoding="UTF-8" ?>

<!--注释对xml文件的说明-->
<users>
    <user id="1001" country="china" source="android">
        <id>1001</id>
        <name>admin</name>
        <password>12345</password>
        <salary>salary>500 & salary < 3000</salary>
    </user>
    <user id="1002" country="china" source="iso">
        <id>1002</id>
        <name>jack</name>
        <password>6666</password>
        <salary><![CDATA[
        salary> 500 & salary < 3000
        ]]></salary>
    </user>


</users>

3.XML约束的介绍
由于xml的标签是没有预定义的,在编写xml文件的时候可以添加任何的额标签,这样不利于解析。
在xml的技术例可以去编写一个xml约束文件来约束xml编写的规范,这被称为xml约束。
xml约束的类型有如下二种:
1.DTD约束(文件的后缀名是.dtd)java web项目的web.xml使用的就是DTD约束。
2.Schema约束(文件的后缀名为.xsd)spring framework的application.xml使用的就是Schema约束。
Schema约束比DTD约束更强大。
1.数据的类型更加完善
2.对元素的出现的次数限制更加灵活
在日常开发中,通常我们不会去编写约束文件,但是我们需要根据约束文件编写符合规范的xml文件,因此看懂即可。

xml约束约束xml文件的内容
1.约束xml标签的层级关系(根标签,子标签,子子标签)
2.约束标签(名称,类型)
3.约束标签的属性(属性名,属性类型,属性约束)

4.XML约束-DTD约束
首先了解一下数量词

  • +表示元素可以出现1-n个
  • *表示可以出现0-N个
  • ,表示元素必须按照指定的顺序出现
  • | 表示枚举中的一个

1.约束标签的层级关系

<!ELEMENT 标签 (子标签)>
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT users (user+)>
<!ELEMENT user (id,name,password)>

2.约束标签

<!ELEMENT 标签名 (标签类型)>

标签的类型:

  • EMPTY 空类型
  • ANY 任意类型
  • #PCDATA 字符串
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>

3.约束标签的属性

<!ATTLIST 标签名
   属性名 属性类型 属性约束
   属性名 属性类型 属性约束
   属性名 属性类型 属性约束
   属性名 属性类型 属性约束
 >

属性类型

  • CDATA :表示文本字符串
  • ID: 表示在xml文件中唯一的,而且不能以数字开头
  • ENUMERATED:表示属性的类型是枚举,只能从枚举的列表中选一个

属性约束

  • REQUIRED:表示该属性必须存在
  • IMPLED:表示该属性可有可无
  • FIXED:表示该属性有固定值 格式为#FIXED “固定值”
<!ATTLIST user
        id ID #REQUIRED
        country CDATA #IMPLIED
        platform CDATA #FIXED "ittimeline"
        source(android|iso|wechat) "android"
        >

DTD约束的使用
根据DTD约束文件的位置不同,使用方式可以分为三种
1.外部DTD-本地DTD,DTD文档在本地磁盘路径,但是和xml文件不是在同一个文件中,DTD文档和xml文件通常在同一个目录下。

<!DOCTYPE 根元素 SYSTEM 'DTD约束的文件名'>
<!DOCTYPE users SYSTEM 'user.dtd'>

2.外部的DTD-公共DTD,DTD文件在网络上,一般都是由框架提供的,也是我们使用最多的。

<!DOCTYPE 根元素  PUBLIC 'DTD约束的文件名' "DTD文档的URL">

3.内部DTD,XML文件和DTD文档在一个XML文件中,DTD约束只会针对当前XML文件有效

<!DOCTYPE 根元素 [元素约束声明]>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE users [
        <!ELEMENT users (user+)>
        <!ELEMENT user (id,name,password)>
        <!ELEMENT id (#PCDATA)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT password (#PCDATA)>
        <!ATTLIST user
                id ID #REQUIRED
                country CDATA #IMPLIED
                platform CDATA #FIXED "ittimeline"
                source (android|iso|wechat) "android"
                >
                <!--        一定要有空格!!!!!!!-->
        ]>

<!--注释对xml文件的说明-->
<users>
    <user id="s1001" country="china" source="android">
        <id>1001</id>
        <name>admin</name>
        <password>12345</password>
<!--        <salary>salary>500 & salary < 3000</salary>-->
    </user>
    <user id="s1002" country="china" source="iso">
        <id>1002</id>
        <name>jack</name>
        <password>6666</password>
<!--        <salary><![CDATA[-->
<!--        salary> 500 & salary < 3000-->
<!--        ]]></salary>-->
    </user>


</users>

5.XML约束-Schema约束
Schema约束的定义

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="https://www.ittimeline.net"
        elementFormDefault="qualified"

>
<!-- 标准的命名空间,固定写法-->

    <xs:element name="orders">
        <xs:complexType>
                  <!-- 定义复杂标签 可以包含多个子标签-->
        <xs:sequence maxOccurs="3" minOccurs="1">
                  <!-- 最多有几个子标签,最小有几个子标签-->
            <xs:element name="order">

                <xs:complexType>

                    <xs:sequence>
                            <!-- 按照子标签元素的内容排序-->
                        <xs:element name="id" type="xs:unsignedInt"></xs:element>
                        <xs:element name="address" type="xs:string"></xs:element>
                        <xs:element name="bookTime" type="xs:dateTime"></xs:element>
                        <xs:element name="amount" type="xs:double"></xs:element>
                    </xs:sequence>
                        <!--定义属性-->
                    <xs:attribute name="orderId" type="xs:unsignedInt" use="required"></xs:attribute>
                </xs:complexType>

            </xs:element>
        </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

6.Schema约束的使用

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

<orders xmlns="https://www.ittimeline.net"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="https://www.ittimeline.net order.xsd">
    <order orderId="1001">
        <id>1001</id>
        <address>上海市黄浦区</address>
        <bookTime>2021-06-20T08:00:00</bookTime>
        <amount>8888.88</amount>
    </order>
    <order orderId="1002">
        <id>1002</id>
        <address>上海市长命桥</address>
        <bookTime>2021-06-20T08:00:00</bookTime>
        <amount>8888.88</amount>
    </order>
    <order orderId="1003">
        <id>1003</id>
        <address>上海市静安区</address>
        <bookTime>2021-06-20T08:00:00</bookTime>
        <amount>8888.88</amount>
    </order>

</orders>