一、XML介绍
- xml 可扩展标签
- 标签无定义,可自定义
- 作用:存储数据和传输数据
二、组成部分
1. 文档声明
文档声明必须位于第一行,前面有空行也不允许。
<?xml version="1.0" encoding="UTF-8"?>
2. 元素
3. 属性
<users>
<user id="TB1002" country="Chinese" source="Ios">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
</users>
4. 注释
选择单行或多行注释是否顶格。
5. 转义字符
识别& <
<salary> salaty >15000 & salary < 30000</salary>
6. 字符区
CDATA内部视为字符串。(CD快捷键)
<salary>
<![CDATA[
salaty >15000 & salary < 30000
]]>
</salary>
案例参考:user.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users SYSTEM "user.dtd">
<users>
<user id="TB1001" country="Chinese" source="Android">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
<user id="TB1002" country="Chinese" source="Ios">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
</users>
三、XML约束
xml约束文件来约束XML编写的规范
- 约束层级关系(根标签、子标签)
- 约束标签(名称、类型、属性)
无约束,可以添加任意标签,不利于解析。
介绍以下下两种约束类型:DTD和Schema
1.DTD约束(文件后缀名: .dtd)
1. 约束层级关系
根标签users , 至少有一个user标签
<!ELEMENT users (user+)>
<!-- , 表示必须按照指定顺序出现 id name password-->
<!ELEMENT user (id,name,password)>
2. 约束标签
标签类型:
- EMPTY 空类型
- **ANY 任意类型
- #PCDATA 字符串**
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
3. 约束标签属性
属性类型:
- CDATA 字符串
- ID 唯一的,不能以数字开头
- ENUMERATED:枚举中的一个
属性约束:
- REQUIRED 必须存在的
- IMPLED 属性可有可无
- FIXED 属性固定值
user标签的属性:
<!ATTLIST user
属性名 属性类型 属性约束
id ID #REQUIRED
country CDATA #IMPLIED
platform CDATA #FIXED "plat001"
source (Android|PC|Ios|WeChat) "Android"
三选一,默认“Android”
>
案例参考:user.dtd
<?xml version="1.0" encoding="UTF-8" ?>
<!--约束层级关系-->
<!--数量词
+ 1-n
* 0-n
-->
<!--定义根标签users,至少有一个user标签-->
<!ELEMENT users (user+)>
<!-- , 表示必须按照指定顺序出现 id name password-->
<!ELEMENT user (id,name,password)>
<!--约束标签-->
<!--标签类型: EMPTY空类型 ANY任意类型 #PCDATA字符串-->
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!--约束标签属性-->
<!--属性类型:CDATA 字符串-->
<!-- ID 唯一的,不能以数字开头-->
<!-- ENUMERATED:枚举中的一个-->
<!--属性约束:REQUIRED 必须存在的-->
<!-- IMPLED 属性可有可无-->
<!-- FIXED 属性固定值-->
<!--属性名 属性类型 属性约束-->
<!--三选一,默认Android-->
<!--里面不要有注释,不然会报错-->
<!ATTLIST user
id ID #REQUIRED
country CDATA #IMPLIED
platform CDATA #FIXED "plat001"
source (Android|PC|Ios|WeChat) "Android"
>
2.Schema约束(.xsd)
将scheme约束绑定到目标空间(targetNamespace),其他的死记。
<xs:schema(以此开头)
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.jiang.net"
elementFormDefault="qualified"
>
表示:
标签 <xs:element name="orders">
复杂标签(标签里面有标签,有子标签)<xs:complexType>
标签按照顺序出现(最大出现次数,最小出现次数) <xs:sequence maxOccurs="3" minOccurs="1">
属性 <xs:attribute name="orderId" type="xs:unsignedInt" use="required"></xs:attribute>
案例: users下有user,user下有id,address,bookTime,amount,并且有属性
<?xml version="1.0" encoding="UTF-8" ?>
<!--一个标准命令空间-->
<!--将schema约束绑定到目标命名空间 可以假的没啥用-->
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.jiang.net"
elementFormDefault="qualified"
>
<xs:element name="orders">
<xs:complexType>
<xs:sequence maxOccurs="3" minOccurs="1">
<xs:element name="order">
<xs:complexType> <!--最小值是0-->
<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>
<!--order标签的属性值 orderId 无符号整数 必须存在-->
<xs:attribute name="orderId" type="xs:unsignedInt" use="required"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
对应xml
根标签选定目标空间
<orders xmlns="https://www.jiang.net">
<?xml version="1.0" encoding="UTF-8" ?>
<orders
xmlns="https://www.jiang.net"
>
<!--ns namespace缩写-->
<order orderId="10001">
<id>10001</id>
<address>上海</address>
<bookTime>2022-11-09T14:21:00</bookTime>
<amount>8888.88</amount>
</order>
<order orderId="10002">
<id>10002</id>
<address>长沙</address>
<bookTime>2022-11-09T14:21:00</bookTime>
<amount>8888.88</amount>
</order>
<order orderId="10003">
<id>10003</id>
<address>成都</address>
<bookTime>2022-11-09T14:21:00</bookTime>
<amount>8888.88</amount>
</order>
</orders>
约束的引用
.dtd约束引用
- 文件在本地
<!DOCTYPE 根元素 SYSTEM "约束文件名">-->
- 网络上
<!DOCTYPE 根元素 PUBLIC "DTD约束的文件名" "DTD文档的URL">
- 内部(约束写在同一个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 "plat001"
source (Android|PC|Ios|WeChat) "Android"
>
]>
<users>
<user id="TB1001" country="Chinese" source="Android">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
<user id="TB1002" country="Chinese" source="Ios">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
</users>
总流程
.dtd
1. 写约束
- 文档声明(空行不允许)
- .dtd文件:
约束层级关系
<!--定义根标签users,至少有一个user标签-->
<!ELEMENT users (user+)>
<!-- , 表示必须按照指定顺序出现 id name password-->
<!ELEMENT user (id,name,password)>
约束标签
<!--约束标签-->
<!--标签类型: EMPTY空类型 ANY任意类型 #PCDATA字符串-->
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>
约束标签属性
<!--约束标签属性-->
<!--属性类型:CDATA 字符串-->
<!-- ID 唯一的,不能以数字开头-->
<!-- ENUMERATED:枚举中的一个-->
<!--属性约束:REQUIRED 必须存在的-->
<!-- IMPLED 属性可有可无-->
<!-- FIXED 属性固定值-->
<!--属性名 属性类型 属性约束-->
<!--三选一,默认Android-->
<!--里面不要有注释,不然会报错-->
<!ATTLIST user
id ID #REQUIRED
country CDATA #IMPLIED
platform CDATA #FIXED "plat001"
source (Android|PC|Ios|WeChat) "Android"
>
2. 写xml
- 文档声明
- 引入约束文件.dtd
- 写标签、属性
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users SYSTEM "user.dtd">
<users>
<user id="TB1001" country="Chinese" source="Android">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
<user id="TB1002" country="Chinese" source="Ios">
<id>10001</id>
<name>admin</name>
<password>111111</password>
</user>
</users>
2…xsd
1.写约束
- 文档声明
- 空间绑定 三个
- 标签层级关系
- 属性
<?xml version="1.0" encoding="UTF-8" ?>
<!--一个标准命令空间-->
<!--将schema约束绑定到目标命名空间 可以假的没啥用-->
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.jiang.net"
elementFormDefault="qualified"
>
<xs:element name="orders">
<!--复杂标签:标签里面有标签-->
<xs:complexType>
<!--按照顺序出现,最大出现次数-->
<xs:sequence maxOccurs="3" minOccurs="1">
<!--orders下的子标签order-->
<xs:element name="order">
<xs:complexType> <!--最小值是0-->
<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>
<!--order标签的属性值 orderId 无符号整数 必须存在-->
<xs:attribute name="orderId" type="xs:unsignedInt" use="required"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
2.写xml
- 文档声明
- 根标签指定目标空间
- 写标签
<?xml version="1.0" encoding="UTF-8" ?>
<orders
xmlns="https://www.jiang.net"
>
<!--ns namespace缩写-->
<order orderId="10001">
<id>10001</id>
<address>上海</address>
<bookTime>2022-11-09T14:21:00</bookTime>
<amount>8888.88</amount>
</order>
<order orderId="10002">
<id>10002</id>
<address>长沙</address>
<bookTime>2022-11-09T14:21:00</bookTime>
<amount>8888.88</amount>
</order>
<order orderId="10003">
<id>10003</id>
<address>成都</address>
<bookTime>2022-11-09T14:21:00</bookTime>
<amount>8888.88</amount>
</order>
</orders>