XSD文件详解(以Maven为例)
什么是XSD
XML Schema 的作用是定義 XML 文檔的合法構(gòu)建模塊,類似 DTD。
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文檔的結(jié)構(gòu)。
XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。
XML Schema:
Xml Schema的用途
根元素
schema 聲明:
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://maven.apache.org/POM/4.0.0"xmlns="http://maven.apache.org/POM/4.0.0"> ... ... </xs:schema>xmlns:xs=“http://www.w3.org/2001/XMLSchema” 表示元素和數(shù)據(jù)類型等定義來自w3,同時(shí)它還規(guī)定了來自命名空間 w3 的元素和數(shù)據(jù)類型應(yīng)該使用前綴 xs:
targetNamespace=“http://maven.apache.org/POM/4.0.0” 顯示被此 schema 定義的元素 來自命名空間
xmlns=“http://maven.apache.org/POM/4.0.0” 表示此文檔的默認(rèn)命名空間
elementFormDefault=“qualified” 任何 XML 實(shí)例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定
在 XML 文檔中引用 Schema
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> </project>規(guī)定了默認(rèn)命名空間的聲明。此聲明會(huì)告知 schema 驗(yàn)證器,在此 XML 文檔中使用的所有元素都被聲明于"http://maven.apache.org/POM/4.0.0" 這個(gè)命名空間。
schemaLocation 屬性有兩個(gè)值。第一個(gè)值是需要使用的命名空間。第二個(gè)值是供命名空間使用的 XML schema 的位置
XSD簡(jiǎn)易元素
除此之外,簡(jiǎn)易元素還有幾個(gè)屬性,nillable:表示XML文檔中某個(gè)[元素取值] 是否可以為空,默認(rèn)值為false,表示不能為空,fixed: 表示要定義元素的固定值,此元素只可以取這些值
<xs:attribute name="combine.children" type="xs:string"/>
name=”combine.children” 表示要定義屬性的名字,type=”xs:string” 表示要定義屬性的數(shù)據(jù)類型,
除此之外,default=”2001-01-11” 表示要定義屬性的默認(rèn)值,fixed=”2001-01-11” 表示要定義屬性的固定值,use=”required” 表示此屬性是否是必須指定的,即如果不指定就不符合Schema,默認(rèn)沒有use=”required”屬性表示屬性可有可無
簡(jiǎn)易元素的限定主要有以下幾種類型
| enumeration | 定義可接受值的一個(gè)列表 |
| fractionDigits | 定義所允許的最大的小數(shù)位數(shù)。必須大于等于0。 |
| length | 定義所允許的字符或者列表項(xiàng)目的精確數(shù)目。必須大于或等于0。 |
| maxExclusive | 定義數(shù)值的上限。所允許的值必須小于此值。 |
| maxInclusive | 定義數(shù)值的上限。所允許的值必須小于或等于此值。 |
| maxLength | 定義所允許的字符或者列表項(xiàng)目的最大數(shù)目。必須大于或等于0。 |
| minExclusive | 定義數(shù)值的下限。所允許的值必需大于此值。 |
| minInclusive | 定義數(shù)值的下限。所允許的值必需大于或等于此值。 |
| minLength | 定義所允許的字符或者列表項(xiàng)目的最小數(shù)目。必須大于或等于0。 |
| pattern | 定義可接受的字符的精確序列。 |
| totalDigits | 定義所允許的阿拉伯?dāng)?shù)字的精確位數(shù)。必須大于0。 |
| whiteSpace | 定義空白字符(換行、回車、空格以及制表符)的處理方式。 |
最大最小值限定
<xs:element name="age"><xs:simpleType><xs:restriction base="xs:integer"><xs:minInclusive value="0"/> <xs: minInclusive>表示最小值,包括指定值<xs:maxInclusive value="120"/> <xs: maxInclusive>表示最大值,包括指定值</xs:restriction></xs:simpleType> </xs:element>枚舉限定
<xs:element name="car"><xs:simpleType><xs:restriction base="xs:string"><xs:enumeration value="Audi"/><xs:enumeration value="Golf"/><xs:enumeration value="BMW"/></xs:restriction></xs:simpleType> </xs:element>模式約束
<xs:element name="letter"><xs:simpleType><xs:restriction base="xs:string"><xs:pattern value="[a-z]"/> 可接受的值只有小寫字母 a - z 其中的一個(gè)<xs:pattern value="[A-Z][A-Z][A-Z]"/> 可接受的值是大寫字母 A - Z 其中的三個(gè)<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>可接受的值是大寫或小寫字母 a - z 其中的三個(gè)<xs:pattern value="[xyz]"/> 可接受的值是字母 x, y 或 z 中的一個(gè)<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/> 可接受的值是五個(gè)阿拉伯?dāng)?shù)字的一個(gè)序列,且每個(gè)數(shù)字的范圍是 0-9<xs:pattern value="([a-z])*"/> 可接受的值是 a - z 中零個(gè)或多個(gè)字母<xs:pattern value="([a-z][A-Z])+"/> 可接受的值是一對(duì)或多對(duì)字母,每對(duì)字母由一個(gè)小寫字母后跟一個(gè)大寫字母組成<xs:pattern value="male|female"/> 可接受的值是 male 或者 female<xs:pattern value="[a-zA-Z0-9]{8}"/> 可接受的值是由 8 個(gè)字符組成的一行字符,這些字符必須是大寫或小寫字母 a - z 亦或數(shù)字 0 - 9</xs:restriction></xs:simpleType> </xs:element>空白字符限定
<xs:element name="address"><xs:simpleType><xs:restriction base="xs:string"><xs:whiteSpace value="preserve"/> whiteSpace 限定被設(shè)置為 "preserve",這意味著 XML 處理器不會(huì)移除任何空白字符<xs:whiteSpace value="replace"/> whiteSpace 限定被設(shè)置為 "replace",這意味著 XML 處理器將替換所有空白字符(換行、回車、空格以及制表符)<xs:whiteSpace value="collapse"/>whiteSpace 限定被設(shè)置為 "collapse",這意味著 XML 處理器將移除所有空白字符(換行、回車、空格以及制表符會(huì)被替換為空格,開頭和結(jié)尾的空格會(huì)被移除,而多個(gè)連續(xù)的空格會(huì)被縮減為一個(gè)單一的空格)</xs:restriction></xs:simpleType> </xs:element>長(zhǎng)度限定
<xs:element name="password"><xs:simpleType><xs:restriction base="xs:string"><xs:length value="8"/> 值必須精確到 8 個(gè)字符<xs:minLength value="5"/> 值最小為 5 個(gè)字符<xs:maxLength value="8"/> 最大為 8 個(gè)字符</xs:restriction></xs:simpleType> </xs:element>XSD復(fù)合類型
定義復(fù)合元素有兩種方法
1、 通過命名此元素,可直接對(duì)元素進(jìn)行聲明
2、元素可以使用 type 屬性,這個(gè)屬性的作用是引用要使用的復(fù)合類型的名稱
<xs:element name="dependencyManagement" minOccurs="0" type="DependencyManagement"></xs:element> <xs:complexType name="DependencyManagement"> <xs:all><xs:element name="dependencies" minOccurs="0"><xs:complexType><xs:sequence><xs:element name="dependency" minOccurs="0" maxOccurs="unbounded" type="Dependency"/></xs:sequence></xs:complexType></xs:element></xs:all></xs:complexType>空元素
<xs:element name="configuration" minOccurs="0"><xs:complexType><xs:attribute name="combine.children" type="xs:string"/><xs:attribute name="combine.self" type="xs:string"/></xs:complexType></xs:element>僅含元素
<xs:sequence>。它意味著被定義的元素必須按上面的次序出現(xiàn)在元素中
僅含文本
此類型僅包含簡(jiǎn)易的內(nèi)容(文本和屬性),因此我們要向此內(nèi)容添加 simpleContent 元素。當(dāng)使用簡(jiǎn)易內(nèi)容時(shí),我們就必須在 simpleContent 元素內(nèi)定義擴(kuò)展或限定,就像這樣:
混合元素
為了使字符數(shù)據(jù)可以出現(xiàn)在 “l(fā)etter” 的子元素之間,mixed 屬性必須被設(shè)置為 “true”
指示器
通過指示器,我們可以控制在文檔中使用元素的方式。在XSD中有七種指示器:
Order 指示器:All,Choice,Sequence ;用于定義元素的順序
Occurrence 指示器:maxOccurs,minOccurs;Occurrence 指示器用于定義某個(gè)元素出現(xiàn)的頻率。maxOccurs 以及 minOccurs 的默認(rèn)值均為 1。
Group 指示器:Group name, attributeGroup name;Group 指示器用于定義相關(guān)的數(shù)批元素。
<all> 指示器規(guī)定子元素可以按照任意順序出現(xiàn),且每個(gè)子元素必須只出現(xiàn)一次<xs:element name="person"><xs:complexType><xs:all><xs:element name="firstname" type="xs:string"/><xs:element name="lastname" type="xs:string"/></xs:all></xs:complexType> </xs:element>
<choice> 指示器規(guī)定可出現(xiàn)某個(gè)子元素或者可出現(xiàn)另外一個(gè)子元素(非此即彼):<xs:element name="person"><xs:complexType><xs:choice><xs:element name="employee" type="employee"/><xs:element name="member" type="member"/></xs:choice></xs:complexType> </xs:element>
<sequence> 規(guī)定子元素必須按照特定的順序出現(xiàn):<xs:element name="person"><xs:complexType><xs:sequence><xs:element name="firstname" type="xs:string"/><xs:element name="lastname" type="xs:string"/></xs:sequence></xs:complexType> </xs:element>
指示器可規(guī)定某個(gè)元素可出現(xiàn)的最大次數(shù),如需使某個(gè)元素的出現(xiàn)次數(shù)不受限制,請(qǐng)使用 maxOccurs=“unbounded” 這個(gè)聲明<xs:element name="person"><xs:complexType><xs:sequence><xs:element name="full_name" type="xs:string"/><xs:element name="child_name" type="xs:string" maxOccurs="10"/></xs:sequence></xs:complexType> </xs:element>
指示器可規(guī)定某個(gè)元素能夠出現(xiàn)的最小次數(shù):<xs:element name="person"><xs:complexType><xs:sequence><xs:element name="full_name" type="xs:string"/><xs:element name="child_name" type="xs:string"maxOccurs="10" minOccurs="0"/></xs:sequence></xs:complexType> </xs:element>
用來定義相關(guān)的一組元素。<xs:group name="persongroup"><xs:sequence><xs:element name="firstname" type="xs:string"/><xs:element name="lastname" type="xs:string"/><xs:element name="birthday" type="xs:date"/></xs:sequence> </xs:group><xs:element name="person" type="personinfo"/><xs:complexType name="personinfo"><xs:sequence><xs:group ref="persongroup"/><xs:element name="country" type="xs:string"/></xs:sequence> </xs:complexType>
用來定義相關(guān)的一組屬性。<xs:attributeGroup name="personattrgroup"><xs:attribute name="firstname" type="xs:string"/><xs:attribute name="lastname" type="xs:string"/><xs:attribute name="birthday" type="xs:date"/> </xs:attributeGroup><xs:element name="person"><xs:complexType><xs:attributeGroup ref="personattrgroup"/></xs:complexType> </xs:element>
any元素
通過使用 <any> 元素,我們可以通過任何元素(在 <lastname> 之后)擴(kuò)展 “person” 的內(nèi)容
<xs:element name="person"><xs:complexType><xs:sequence><xs:element name="firstname" type="xs:string"/><xs:element name="lastname" type="xs:string"/><xs:any minOccurs="0"/></xs:sequence></xs:complexType> </xs:element>anyAttribute元素
元素使我們有能力通過未被 schema 規(guī)定的屬性來擴(kuò)展 XML 文檔!
<xs:element name="person"><xs:complexType><xs:sequence><xs:element name="firstname" type="xs:string"/><xs:element name="lastname" type="xs:string"/></xs:sequence><xs:anyAttribute/></xs:complexType> </xs:element>substitutionGroup元素替換
<xs:element name="name" type="xs:string"/> <xs:element name="navn" substitutionGroup="name"/><xs:complexType name="custinfo"><xs:sequence><xs:element ref="name"/></xs:sequence> </xs:complexType><xs:element name="customer" type="custinfo"/> <xs:element name="kunde" substitutionGroup="customer"/>XSD數(shù)據(jù)類型
1、XSD字符串
字符串?dāng)?shù)據(jù)類型用于可包含字符串的值,可包含字符、換行、回車以及制表符。
可與字符串?dāng)?shù)據(jù)類型一同使用的限定:enumeration、length、maxLength、minLength、pattern (NMTOKENS、IDREFS 以及 ENTITIES 無法使用此約束)、whiteSpace
| ENTITIES | |
| ENTITY | |
| ID | 在 XML 中提交 ID 屬性的字符串 (僅與 schema 屬性一同使用) |
| IDREF | 在 XML 中提交 IDREF 屬性的字符串(僅與 schema 屬性一同使用) |
| IDREFS | language 包含合法的語言 id 的字符串 |
| Name | 包含合法 XML 名稱的字符串 |
| NCName | |
| NMTOKEN | 在 XML 中提交 NMTOKEN 屬性的字符串 (僅與 schema 屬性一同使用) |
| NMTOKENS | |
| normalizedString | 不包含換行符、回車或制表符的字符串 |
| QName | |
| string | 字符串 |
| token | 不包含換行符、回車或制表符、開頭或結(jié)尾空格或者多個(gè)連續(xù)空格的字符串 |
2、日期和時(shí)間類型
| date | 定義一個(gè)日期值 |
| dateTime | 定義一個(gè)日期和時(shí)間值 |
| duration | 定義一個(gè)時(shí)間間隔 |
| gDay | 定義日期的一個(gè)部分 - 天 (DD) |
| gMonth | 定義日期的一個(gè)部分 - 月 (MM) |
| gMonthDay | 定義日期的一個(gè)部分 - 月和天 (MM-DD) |
| gYear | 定義日期的一個(gè)部分 - 年 (YYYY) |
| gYearMonth | 定義日期的一個(gè)部分 - 年和月 (YYYY-MM) |
| time | 定義一個(gè)時(shí)間值 |
3、數(shù)值數(shù)據(jù)類型
可與數(shù)值數(shù)據(jù)類型一同使用的限定:enumeration、fractionDigits、maxExclusive、maxInclusive、minExclusive、minInclusive、pattern、totalDigits、whiteSpace
| byte | 有正負(fù)的 8 位整數(shù) |
| decimal | 十進(jìn)制數(shù) |
| int | 有正負(fù)的 32 位整數(shù) |
| integer | 整數(shù)值 |
| long | 有正負(fù)的 64 位整數(shù) |
| negativeInteger | 僅包含負(fù)值的整數(shù) ( …, -2, -1.) |
| nonNegativeInteger | 僅包含非負(fù)值的整數(shù) (0, 1, 2, …) |
| nonPositiveInteger | 僅包含非正值的整數(shù) (…, -2, -1, 0) |
| positiveInteger | 僅包含正值的整數(shù) (1, 2, …) |
| short | 有正負(fù)的 16 位整數(shù) |
| unsignedLong | 無正負(fù)的 64 位整數(shù) |
| unsignedInt | 無正負(fù)的 32 位整數(shù) |
| unsignedShort | 無正負(fù)的 16 位整數(shù) |
| unsignedByte | 無正負(fù)的 8 位整數(shù) |
4、雜項(xiàng)數(shù)據(jù)類型
可與雜項(xiàng)數(shù)據(jù)類型一同使用的限定:enumeration (布爾數(shù)據(jù)類型無法使用此約束*)、length (布爾數(shù)據(jù)類型無法使用此約束)、maxLength (布爾數(shù)據(jù)類型無法使用此約束)、minLength (布爾數(shù)據(jù)類型無法使用此約束)、pattern、whiteSpace
| anyURI | |
| base64Binary | |
| boolean | |
| double | |
| float | |
| hexBinary | |
| NOTATION | |
| QName |
總結(jié)
以上是生活随笔為你收集整理的XSD文件详解(以Maven为例)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gcc和g++有什么区别?
- 下一篇: 测试内存对齐对运行速度的影响