Schema:原稱爲XSD(XML Schema Definition),是由微軟提出的規範,現成爲W3C規範
XML Schema是用一套內置的XML元素和屬性建立的,這些元素和屬性定義了XML文檔的結構和內容模式。
XML Schema規定XML文檔實例的結構和每一個元素/屬性的數據類型git
首先建立一個xml文檔數據庫
<?xml version="1.0" encoding="UTF-8"?> <student> <name>貂蟬</name> <age>20</age> </student>
先使用內部的dtd對xml文檔作約束ide
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE student[ <!ELEMENT student (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> <student> <name>貂蟬</name> <age>20</age> </student>
那麼若是採用schema如何來編寫呢?ui
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="name" type="xs:string"></xs:element> <xs:element name="age" type="xs:int"></xs:element> <!--定義一個數據類型--> <xs:complexType name="stuType"> <xs:sequence> <xs:element ref="name"></xs:element> <xs:element ref="age"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="student" type="stuType"></xs:element> </xs:schema>
編寫一個xml引用此schema編碼
<?xml version="1.0" encoding="UTF-8"?> <student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd01.xsd"> <name>關羽</name> <age>20</age> </student>
dtd的語法的侷限性:spa
一、dtd使用的是一種語法,而xml使用的是另一種語法rest
二、dtd的數據類型是有限的,與咱們講的數據庫中數據類型不一致code
三、dtd不能夠擴展,而且不支持命令空間orm
Schema的好處:xml
一、Schema也是遵照xml的語法
二、schema大大擴充了數據類型,也能夠自定義本身的數據類型
三、它也支持元素的繼承,支持元素組合屬性組的概念
四、開發性,多個schema的聲明能夠應用到一個xml文檔中。
schema文檔的結構
引用schema的文檔
數據類型分類:
簡單類型
內置的數據類型(built-in data types)
l基本的數據類型(Primitive Data Types)
l擴展的數據類型(Deriverd Data Types)
用戶自定義數據類型(經過simpleType定義)
複雜類型(經過complexType定義)
基本數據類型
數據類型 | 描述 |
---|---|
string | 表示字符串 |
boolean | 布爾型 |
decimal | 表明特定精度的數字 |
float | 表示單精度32位浮點數 |
double | 表示雙精度64位浮點數 |
duration | 表示持續時間 |
dateTime | 表明特定的時間 |
time | 表明特定的時間,可是是天天重複的 |
date | 表明日期 |
hexBinary | 表明十六進制數 |
anyURI | 表明一個URI,用來定位文件 |
QName | 表明限定(qualified)名稱,即有前綴的字符串 |
擴展的數據類型
數據類型 | 描述 |
---|---|
ID | 用於惟一標識元素 |
IDREF/ IDREFS | 參考ID類型的元素或屬性 |
ENTITY/ENTITIES | 實體類型 |
NMTOKEN | NMTOKEN類型 |
NMTOKENS | NMTOKEN類型集 |
long | 表示整型數,大小介於-9223372036854775808 和9223372036854775807之間 |
int | 表示整型數,大小介於-2147483648和 2147483647之間 |
short | 表示整型數,大小介於-32768和32767之間 |
byte | 表示整型數,大小介於-128和127之間 |
NOTATION | 表明 NOTATION類型,QName的派生類型 |
其餘數據類型
數據類型 | 描述 |
---|---|
gYear/gYearMonth | 指定格式的日期 |
gMonth/gMonthDay | 指定格式的日期 |
gDay | 指定格式的日期 |
base64Binary | 使用base64-encoded編碼的2進制數據 |
language | 語言字符,string的派生 |
Name | 有效的XML字符串,string的派生 |
NCName | Name的派生,字符串中不容許「:」 |
negativeInteger | 表示負整數,<= -1 |
positiveInteger | 表示正整數,>=1 |
nonNegativeInteger | >=0,另有nonPositiveInteger表示<=0 |
unsignedLong | 無符號數,還有un…Int、Short、Byte |
數據類型的約束
特性 | 描述 |
---|---|
enumeration | 在指定的數據集中選擇,限定用戶的選值 |
fractionDigits | 限定最大的小數位,用於控制精度 |
length | 指定數據的長度 |
maxExclusive / minExclusive | 指定數據的最大/小值(小於/大於) |
maxInclusive / minInclusive | 指定數據的最大/小值(小於等於/大於等於) |
maxLength / minLength | 指定長度的最大/小值 |
pattern | 指定數據的顯示規範,具體規則見下頁 |
whiteSpace | 空白字符的處理:preserve/replace/collapse |
precision | 十進制數據容許的位數 |
scale | 小數部分的位數 |
正則描述
規範 | 描述 |
---|---|
\d | 任意一個數字,如:Chap\dàChap一、Chap9…… |
* | 前的字符任意重複,如:abàb、ab、aaaaab…… |
[ ] | [ ]內的字符集中任意一個,如:[xyz]aàxa、ya、za |
? | ?前的字符出現0或1次 |
+ | + 前的字符至少出現1次 |
- | 指定範圍,如:[a-d]yàay、by、cy、dy |
{n} | { }前的字符出現n次,如:a{3}xàaaax |
{min,max} | { }前的字符至少出現min次,至多max次,如:a{1,3}xàax、aax、aaax |
•schema、element、attribute、group、attributeGroup
•simpleType
•simpleContent
•complexType
案例:xsd02.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <!--定義元素--> <xs:element name="name" type="xs:string"></xs:element> <xs:element name="type" type="xs:string"></xs:element> <!--定義是一個類型--> <xs:complexType name="heroType"> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="name"></xs:element> <xs:element ref="type"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="hero" type="heroType"></xs:element> <!--定義了一個類型,這個類型中包含多個hero元素--> <xs:complexType name="herosType"> <xs:sequence maxOccurs="unbounded"> <xs:element ref="hero"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="heros" type="herosType"></xs:element> </xs:schema>
xml文件引用
<?xml version="1.0" encoding="UTF-8"?> <heros xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd02.xsd"> <hero> <name>關羽</name> <type>戰士</type> </hero> <hero> <name>曹操</name> <type>戰士</type> </hero> <hero> <name>亞瑟</name> <type>戰士</type> </hero> <hero> <name>安其拉</name> <type>法師</type> </hero> </heros>
把一組元素聲明組合在一塊兒,以便它們可以一塊兒被複合類型應用
案例,使用group組來進行改寫代碼
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <!--定義元素--> <xs:element name="name" type="xs:string"></xs:element> <xs:element name="type" type="xs:string"></xs:element> <!--定義一個元素組--> <xs:group name="myElGroup"> <xs:sequence> <xs:element ref="name"></xs:element> <xs:element ref="type"></xs:element> </xs:sequence> </xs:group> <!--定義是一個類型--> <xs:complexType name="heroType"> <xs:group ref="myElGroup"></xs:group> </xs:complexType> <xs:element name="hero" type="heroType"></xs:element> <!--定義了一個類型,這個類型中包含多個hero元素--> <xs:complexType name="herosType"> <xs:sequence maxOccurs="unbounded"> <xs:element ref="hero"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="heros" type="herosType"></xs:element> </xs:schema>
實際上xml文件並不須要發生任何的改變
案例1:直接定義屬性
<xs:complexType name="heroType"> <xs:group ref="myElGroup"></xs:group> <xs:attribute name="age" type="xs:int" use="required"></xs:attribute> <xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute> <xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute> </xs:complexType>
而後咱們在使用attributeGroup來定義屬性組
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <!--定義元素--> <xs:element name="name" type="xs:string"></xs:element> <xs:element name="type" type="xs:string"></xs:element> <!--定義一個元素組--> <xs:group name="myElGroup"> <xs:sequence> <xs:element ref="name"></xs:element> <xs:element ref="type"></xs:element> </xs:sequence> </xs:group> <xs:attributeGroup name="myAttrGroup"> <xs:attribute name="age" type="xs:int" use="required"></xs:attribute> <xs:attribute name="birthday" type="xs:date" use="optional"></xs:attribute> <xs:attribute name="addr" type="xs:string" use="prohibited"></xs:attribute> </xs:attributeGroup> <!--定義是一個類型--> <xs:complexType name="heroType"> <xs:group ref="myElGroup"></xs:group> <xs:attributeGroup ref="myAttrGroup"></xs:attributeGroup> </xs:complexType> <xs:element name="hero" type="heroType"></xs:element> <!--定義了一個類型,這個類型中包含多個hero元素--> <xs:complexType name="herosType"> <xs:sequence maxOccurs="unbounded"> <xs:element ref="hero"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="heros" type="herosType"></xs:element> </xs:schema>
•做用:定義一個簡單類型,它決定了元素和屬性值的約束和相關信息
•屬性:name
•內容:應用已經存在的簡單類型,三種方式:
restriction:限定一個範圍
list:從列表中選擇
union:包含一個值的結合
案例1:schema文件定義:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:simpleType name="myAge"> <xs:restriction base="xs:int"> <xs:minInclusive value="0"></xs:minInclusive> <xs:maxInclusive value="100"></xs:maxInclusive> </xs:restriction> </xs:simpleType> <xs:element name="sname" type="xs:string"></xs:element> <xs:element name="age" type="myAge"></xs:element> <xs:complexType name="stuType"> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:element ref="sname"></xs:element> <xs:element ref="age"></xs:element> </xs:sequence> </xs:complexType> <xs:element name="student" type="stuType"> </xs:element> </xs:schema>
引用
<?xml version="1.0" encoding="UTF-8"?> <student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd"> <sname>貂蟬</sname> <!--此時age中內容必須符合myage的定義要求--> <age>100</age> </student>
案例2:
<xs:simpleType name="mybirthday"> <xs:list itemType="xs:date"></xs:list> </xs:simpleType>
引用
<?xml version="1.0" encoding="UTF-8"?> <student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd03.xsd"> <sname>貂蟬</sname> <!--此時age中內容必須符合myage的定義要求--> <age>100</age> <birthday>2012-01-22 2018-02-22</birthday> </student>
案例3:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <!--定義了一個屬性--> <xs:attribute name="allframesize"> <xs:simpleType> <!--聯合--> <xs:union> <xs:simpleType> <xs:restriction base="roadbikesize"/> </xs:simpleType> <xs:simpleType> <xs:restriction base="mountainbikesize"/> </xs:simpleType> </xs:union> </xs:simpleType> </xs:attribute> <!--定義了一個simpleType類型--> <xs:simpleType name="roadbikesize"> <xs:restriction base="xs:positiveInteger"> <xs:enumeration value="16"/> <xs:enumeration value="20"/> <xs:enumeration value="28"/> </xs:restriction> </xs:simpleType> <!--定義了一個simpleType類型--> <xs:simpleType name="mountainbikesize"> <xs:restriction base="xs:string"> <xs:enumeration value="small"/> <xs:enumeration value="medium"/> <xs:enumeration value="large"/> </xs:restriction> </xs:simpleType> <xs:element name="name" type="xs:string"></xs:element> <xs:complexType name="stuType"> <xs:sequence minOccurs="1" maxOccurs="5"> <xs:element ref="name"></xs:element> </xs:sequence> <xs:attribute ref="allframesize"></xs:attribute> </xs:complexType> <xs:element name="student" type="stuType"></xs:element> </xs:schema>
引用文件
<?xml version="1.0" encoding="UTF-8"?> <!--allframesize的值能夠是roadbikesize或者mountainbikesize--> <student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd04.xsd" allframesize="small"> <name></name> </student>
complexType:定義一個複合類型,它決定了一組元素和屬性值的約束和相關信息
simpleContent:應用於complexType,對它的內容進行約束和擴展。
案例:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:complexType name="stuType"> <xs:simpleContent> <!--內容只能放小數--> <xs:extension base="xs:decimal"> <!--stuType有一個屬性sizing--> <xs:attribute name="sizing" use="required"> <!--屬性是基於simpleType類型的--> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="US"/> <xs:enumeration value="Euro"/> <xs:enumeration value="UK"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:element name="student" type="stuType"></xs:element> </xs:schema>
引用schema文件
<?xml version="1.0" encoding="UTF-8"?> <student sizing="US" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Users\Administrator\Desktop\demo\xsd05.xsd"> 10.1 </student>
總結一下:
SimpleType:基於已有數據類型的擴展
ComplexType:定義一個複合類型
SimpleContent:對ComplexType的內容作限定,這個複合類型沒有子元素,只能存在文本或者屬性