XML文件需要包括文档声明
文档声明是可选的 可写可不写 但一般都写 包括xml的版本version以及编码的方式encoding
XML目前的版本是1.0 encoding一般都会写UTF-8
<?xml version="1.0" encoding="utf-8" ?>
需要以<? 开头 并以?>结尾
元素:元素是XML的重要组成成分
每一个XML都必须有一个根标签
标签必须有开始标签和结束标签 标签可以中间添加标签但是不能随便添加 明确层级关系
XML标签的命名规则区分大小写 不能带空格和冒号
<users> <user> <id>10001</id> <name>Jenny</name> <password>88888</password> </user> <user> <id>10002</id> <name>Jim</name> <password>99999</password> </user> </users>
元素的属性
定义格式 : 属性名=属性值 属性值需要用“”包裹起来
多个属性名不能相同
<users> <user id="10001" country="CHINA" source="android"> <id>10001</id> <name>Jenny</name> <password>88888</password> </user> <user id="10002" country="CHINA" source="ios"> <id>10002</id> <name>Jim</name> <password>99999</password> </user> </users>
注释 :<!---->
转义字符:在XML中有些字符是无法识别的,此时需要XML的转义字符来表示
&使用&表示 <使用<表示
<price> price >900 & age<18 </price>
字符区:CDATA内部的所有内容都会被当作文本显示,可以解决有些无法识别的字符问题
IDEA中快捷键是CD然后回车
<price><![CDATA[ price>1800 & age<30 ]]></price>
XML的约束:由于XML的标签是没有预定义的 任何标签都能使用 这不利于解析 所以可以编写XML的约束文件来对XML进行约束
XML约束有两种类型
1.DTD约束(文件后缀名为.dtd)
2.Schema约束(文件后缀名为.xsd).xsd x代表XML s代表Schema d表示Definition
Schema约束比DTD约束更高级
XML约束可以约束的内容
1.约束XML标签的层级关系(根标签 子标签和子子标签等的关系)
2.约束标签
3.约束标签的属性值(属性名,属性类型,属性约束)
XML约束—DTD约束
数量词:+表示可以出现1-n次
*表示可以出现0-n次
,(逗号)表示元素必须按照指定顺序出现
|表示从列表中选且只能选一个
1.约束标签的层级关系
定义根目录为users 下面有子目录user 而且子目录user必须至少出现一次
<!ELEMENT users (user+)>
定义user标签下必须有id name 和password标签 用逗号表示必须依次按顺序出现
<!ELEMENT user(id,name,password)>
2.约束标签的属性值
<!ELEMENT 标签名称(标签类型)
标签名称和标签类型之间的空格不能省略
常见的标签类型
- 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 “固定值”
<!--约束标签的属性--> <!--user标签下的 id属性属性类型为ID类型 必须值 不能重复 不能以数字开头 country为字符类型 可有可无 platform为字符串类型 默认值为 Wechat source为枚举类型 从Android IOS PC WeChat中选择一个 默认值为Android --> <!ATTLIST user id ID #REQUIRED country CDATA #IMPLIED platform CDATA #FIXED "Wechat" source (Android|IOS|PC|WeChat) "Android" >
DTD约束的使用
根据DTD位置的不同 可以分为三种使用方法
1.外部DTD-DTD在本地 DTD在本机上但是和XML不在同一文件中 但是DTD和XML通常是在同一个目录下
使用方法:
XML代码
<!--<!DOCTYPE 根目录 SYSTEM "DTD名称">--> <!DOCTYPE users SYSTEM "User.dtd">
引入User.dtd约束
完整代码
XML
<?xml version="1.0" encoding="utf-8" ?> <!--<!DOCTYPE 根目录 SYSTEM "DTD名称">--> <!DOCTYPE users SYSTEM "User.dtd"> <users> <user id="T10001" country="CHINA" source="Android"> <id>10001</id> <name>Jenny</name> <password>88888</password> <price> price >900 & age<18 </price> </user> <user id="T10002" country="CHINA" source="IOS"> <id>10002</id> <name>Jim</name> <password>99999</password> <price><![CDATA[ price>1800 & age<30 ]]></price> </user> </users>
DTD文件
<?xml version="1.0" encoding="UTF-8" ?> <!--定义根目录为users 里面至少包含一个user子标签--> <!ELEMENT users (user+)> <!-- 定义user标签中必须依次有id name password子标签 而且必须按照顺序 --> <!ELEMENT user (id,name,password,price)> <!--约束标签--> <!--id name password必须字符串类型--> <!ELEMENT id (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT password (#PCDATA)> <!ELEMENT price (#PCDATA)> <!--约束标签的属性--> <!--user标签下的 id属性属性类型为ID类型 必须值 不能重复 不能以数字开头 country为字符类型 可有可无 platform为字符串类型 默认值为 Wechat source为枚举类型 从Android IOS PC WeChat中选择一个 默认值为Android --> <!ATTLIST user id ID #REQUIRED country CDATA #IMPLIED platform CDATA #FIXED "Wechat" source (Android|IOS|PC|WeChat) "Android" >
2.外部DTD-DTD在网络上
使用方法
<!DOCTYPE 根元素 PUBLIC "DTD约束文件名" “DTD约束的URL路径” >
3.内部DTD XML和DTD约束在同一个XML文件中
使用方法:<!DOCTYPE 根元素 [元素约束] >
XML完整代码
<?xml version="1.0" encoding="utf-8" ?> <!--<!DOCTYPE 根目录 SYSTEM "DTD名称">--> <!DOCTYPE users [ <!ELEMENT users (user+)> <!ELEMENT user (id,name,password,price)> <!ELEMENT id (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT password (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST user id ID #REQUIRED country CDATA #IMPLIED platform CDATA #FIXED "Wechat" source (Android|IOS|PC|WeChat) "Android" > ]> <users> <user id="T10001" country="CHINA" source="Android"> <id>10001</id> <name>Jenny</name> <password>88888</password> <price> price >900 & age<18 </price> </user> <user id="T10002" country="CHINA" source="IOS"> <id>10002</id> <name>Jim</name> <password>99999</password> <price><![CDATA[ price>1800 & age<30 ]]></price> </user> </users>
Schema的创建
Orders.XML代码如下
<?xml version="1.0" encoding="UTF-8" ?> <orders> <order OrderID="10001"> <id>10001</id> <address>河北省保定市</address> <BookTime>2019-01-01</BookTime> <amount>88.8</amount> </order> <order OrderID="10002"> <id>10002</id> <address>河北省唐山市</address> <BookTime>2020-01-01</BookTime> <amount>66.6</amount> </order> <order OrderID="10003"> <id>10003</id> <address>河北省石家庄市</address> <BookTime>2021-01-01</BookTime> <amount>520</amount> </order> </orders>
Order.xsd代码如下
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Order" xmlns:tns="http://www.example.org/Order" elementFormDefault="qualified"> <!--orders是order的根元素--> <xs:element name="orders"> <!--表明orders是包含根元素的复杂元素--> <xs:complexType> <!-- sequence: 表示元素是顺序的,即子元素必须按照顺序出现 maxOccurs: 表示元素可以出现多次,默认为1 minOccurs: 表示元素至少出现的次数,默认为1 --> <xs:sequence> <!-- order下的子标签是order --> <xs:element name="order" maxOccurs="3" minOccurs="1"> <!-- 表示order是复杂的标签--> <xs:complexType> <!-- order中包含按照顺序出现的以下标签--> <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> <!-- 标签的属性 类型为无符号的整形 required必须声明--> <xs:attribute name="OrderID" type="xs:unsignedInt" use="required"></xs:attribute> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> <!-- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 表示标准命名空间每个Schema约束都会有一个标准命名空间 targetNamespace="http://www.example.org/Order" xmlns:tns="http://www.example.org/Order" 表示目标命名空间 elementFormDefault="qualified"> </xs:schema>-->
Schema的使用 在根标签下声明xmlns 即xml的命名空间即可使用 指向xsd的目标命名空间
代码如下
<?xml version="1.0" encoding="UTF-8" ?> <orders xmlns="http://www.example.org/Order"> <order OrderID="10001"> <id>10001</id> <address>河北省保定市</address> <BookTime>2019-01-01T00:00:00</BookTime> <amount>88.8</amount> </order> <order OrderID="10002"> <id>10002</id> <address>河北省唐山市</address> <BookTime>2020-01-01T00:00:00</BookTime> <amount>66.6</amount> </order> <order OrderID="10003"> <id>10003</id> <address>河北省石家庄市</address> <BookTime>2021-01-01T00:00:00</BookTime> <amount>520</amount> </order> </orders>
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Order" xmlns:tns="http://www.example.org/Order" elementFormDefault="qualified"> <!--orders是order的根元素--> <xs:element name="orders"> <!--表明orders是包含根元素的复杂元素--> <xs:complexType> <!-- sequence: 表示元素是顺序的,即子元素必须按照顺序出现 maxOccurs: 表示元素可以出现多次,默认为1 minOccurs: 表示元素至少出现的次数,默认为1 --> <xs:sequence> <!-- order下的子标签是order --> <xs:element name="order" maxOccurs="3" minOccurs="1"> <!-- 表示order是复杂的标签--> <xs:complexType> <!-- order中包含按照顺序出现的以下标签--> <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> <!-- 标签的属性 类型为无符号的整形 required必须声明--> <xs:attribute name="OrderID" type="xs:unsignedInt" use="required"></xs:attribute> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> <!-- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 表示标准命名空间每个Schema约束都会有一个标准命名空间 targetNamespace="http://www.example.org/Order" xmlns:tns="http://www.example.org/Order" 表示目标命名空间 elementFormDefault="qualified"> </xs:schema>-->