XML的使用总结

本文详细介绍了XML(可扩展标记语言),包括其作为数据存储和传输格式的作用,XML的组成如文档声明、元素、属性、注释、转义字符和字符区。接着讨论了XML的两种约束类型:DTD和Schema,以及它们各自的特点和应用场景,帮助读者理解如何通过约束来规范XML文件的编写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.XML的介绍

XML(Extensible Markup Language)表示可扩展标记语言
XML的标签没有被预定义也就是说不是固定的,用户可以根据自身的需求去自定义标签

XML的作用主要是用来存储数据和传输数据

存储数据是用于存储有层级关系的数据,例如省市区。
在Java领域XML的使用主要是作为框架的配置文件
Spring Framwork applicantion.xml
Mybatis mybatis.xml
Log4j2 log4j2.xml
传输数据指的是服务提供方返回服务调用方的数据传输格式,目前主流的数据传输格式是JSON XML目前的版本是1.0

2.XML的组成

1)文档声明

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

XML的文档声明是可选的,也就是可以不写,但是开发中大家都会写文档声明
XML的文档声明如果写了必须放在XML文件的第一行第一列,必须以<?xml开头和?>结尾,而且必须包含两个属性:version和encoding

version表示XML的版本,XML目前的版本是1.0
encoding表示XML的编码,一般都会写UTF-8

2)元素(标签)

元素是XML的重要组成部分,元素也称为标签
每个XML文件必须要有一个根标签
标签由开始标签和结束标签组成,开始标签和结束标签中间可以写标签,也可以是文本字符串
标签是可以嵌套使用的,但是不能随便嵌套,必须有明确的层级关系

标签名必须遵守命名规则和命名规范

1.标签名不能以数字开头
2.不能使用XML,Xml,xml
3.不能使用空格和冒号
4.命名区分大小写

<users>
    <user>
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
    </user>

    <user>
        <id>10002</id>
        <name>tony</name>
        <password>666666</password>
    </user>
</users>

3)属性

属性是标签的组成部分,属性只能定义在开始标签中,不能定义在结束标签
属性的定义格式 属性名=属性值,属性值需要使用""包含起来
开始标签中可以定义多个属性,但是多个属性的属性名不能相同
属性名和标签名一样,也要遵守命名规则和命名规范

4)注释

注释就是对XML标签的说明,IDEA中XML注释的快捷键是Ctrl+/

<!--
定义根标签users
-->

5)转义字符

在XML中有些字符是无法识别的,此时就需要用XML的转义字符来表示

	&使用&amp;来表示
	<使用&lt;来表示
<salary> salary > 15000 &amp; salary &lt; 30000</salary>

6)字符区

CDATA内部所有的内容都会当做文本解析,使用字符去解决在XML中有些字符是无法识别的问题
IDEA中CDATA的快捷键是CD,然后回车

<![CDATA[
            
]]>
<salary>
    <![CDATA[
    salary > 15000 &; salary & 30000
    ]]>
</salary>

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约束XSD(XML Schema Definition)
可以根据约束文件的后缀名来判断约束的类型是DTD还是Schema。

为什么有了DTD还要有Schema,Schema约束比DTD约束强大:

1)数据类型更加完善
2)对于元素出现的次数限制更加灵活

XML约束约束XML文件的内容

1)约束XML标签的层级关系(根标签、子标签、子子标签的关系)
2)约束标签(名称、类型)
3)约束标签的属性(属性名、属性类型、属性约束)

4.XML约束-DTD约束

数量词:
+表示元素可以出现1-n个,n个表示多个
*表示元素可以出现0-n个,n个表示多个
,表示元素必须按照指定顺序出现
|表示元素需要选取其中一个

1)约束标签的层级关系

<!--约束标签的层级关系-->
<!--定义users标签为根标签,该标签下至少有1个user标签-->
<!ELEMENT users (user+)>
<!--user标签下必须有三个指定顺序的子标签:id,name,password-->
<!ELEMENT user (id,name,password)>

2)约束标签

标签类型:

EMPTY空类型
ANY任意类型
#PCDATA字符串类型

<!--约束标签-->
<!--id name password 这三个标签的标签类型都是字符串-->
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>

3)约束标签的属性

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

>

属性类型:

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

属性约束:

REQUIRED表示该属性必须存在
IMPLED表示该属性可有可无
FIXED表示该属性有固定值 语法格式是#FIXED “固定值”

4)DTD约束(user.dtd)的定义

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

<!--约束标签的层级关系-->
<!--定义users标签为根标签,该标签下至少有1个user标签-->
<!ELEMENT users (user+)>
<!--user标签下必须有三个指定顺序的子标签:id,name,password-->
<!ELEMENT user (id,name,password)>

<!--约束标签-->
<!--id name password 这三个标签的标签类型都是字符串-->
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>

<!--约束标签的属性-->
<!--
user标签必须包含id属性,属性类型是ID,属性约束是#REQUIRED
user标签必须包含country属性,属性类型是CDATA,属性约束是#IMPLIED
user标签必须包含platform属性,属性类型是CDATA,属性约束是#FIXED
user标签必须包含source属性,属性类型是枚举,默认值是Android
-->
<!ATTLIST user
        id ID #REQUIRED
        country CDATA #IMPLIED
        platform CDATA #FIXED "itti"
        source (Android|iOS|Pc|WeChat) "Android"
        >

5)DTD的使用

1)外部DTD-本地DTD,DTD文档在本地磁盘路径,但是和XML文件不是在同一个文件中,DTD文档和XML文件通常是在同一个目录下。

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE users SYSTEM "user.dtd">
<!--
定义根标签users
-->
<users>
    <user id="S10001" country="Chinese">
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
<!--        <salary> salary > 15000 &amp; salary &lt; 30000</salary>-->
    </user>

    <user id="S10002" country="Chinese" source="iOS">
        <id>10002</id>
        <name>tony</name>
        <password>666666</password>
<!--        <salary>-->
<!--            <![CDATA[-->
<!--            salary > 15000 &; salary & 30000-->
<!--            ]]>-->
<!--        </salary>-->
    </user>
</users>

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 "itti"
            source (Android|iOS|Pc|WeChat) "Android"

            >
        ]>
<users>
    <user id="S10001" country="Chinese">
        <id>10001</id>
        <name>admin</name>
        <password>111111</password>
        <!--        <salary> salary > 15000 &amp; salary &lt; 30000</salary>-->
    </user>

    <user id="S10002" country="Chinese" source="iOS">
        <id>10002</id>
        <name>tony</name>
        <password>666666</password>
        <!--        <salary>-->
        <!--            <![CDATA[-->
        <!--            salary > 15000 &; salary & 30000-->
        <!--            ]]>-->
        <!--        </salary>-->
    </user>
</users>

5.XML约束-Schema约束

1)Schema约束的定义

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

<!--
xmlns="http://www.w3.org/2001/XMLSchema"标识标准命名空间 每个Schema约束都包含一个标准敏明空间
targetNamespace="www.ittimeline.net"表示目标命名空间(自定义命名空间)
-->
<xs:schema
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="https://www.ittimeline.net"
        elementFormDefault="qualified"
>
<!--将schema约束绑定到目标命名空间-->

<!--schema约束-->
<!--
orders是xml文件的根标签
-->
    <xs:element name="orders">
<!--
complexType表示order标签是复杂标签
orders标签是复杂标签,即可以包含其他子标签
-->
        <xs:complexType>
<!--
sequence表示按顺序出现
maxOccurs 表示最大出现次数
minOccurs 表示最小出现次数
-->
            <xs:sequence maxOccurs="3" minOccurs="1">
                <xs:element name="order">
<!--
order标签也是复杂标签
-->
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="id" type="xs:unsignedInt"/>
                            <xs:element name="address" type="xs:string"/>
                            <xs:element name="bookTime" type="xs:dateTime"/>
                            <xs:element name="amount" type="xs:double"/>
                        </xs:sequence>

<!--
order标签必须包含orderId属性,该属性累是无符号整数,而且必须定义
required表示必须定义
optional表示可选的
-->
                        <xs:attribute name="orderID" type="xs:unsignedInt" use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

2)Schema约束的使用

<?xml version="1.0" encoding="UTF-8" ?>
<!--
schema约束的使用
-->
<orders
        xmlns="https://www.ittimeline.net"
>
    <order orderID="10001">
        <id>10001</id>
        <address>上海市黄浦区</address>
        <bookTime>2021-06-20T08:00:00</bookTime>
        <amount>88.88</amount>
    </order>

    <order orderID="10002">
        <id>10002</id>
        <address>上海市长宁区</address>
        <bookTime>2021-06-20T08:00:00</bookTime>
        <amount>88.88</amount>
    </order>

    <order orderID="10003">
        <id>10003</id>
        <address>上海市静安区</address>
        <bookTime>2021-06-20T08:00:00</bookTime>
        <amount>88.88</amount>
    </order>
</orders>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值