XML的使用
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的转义字符来表示
&使用&来表示
<使用<来表示
<salary> salary > 15000 & salary < 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 & salary < 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 & salary < 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>