XML從入門到深入(超詳細(xì))
點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達
作者 | 螞蟻小哥
來源 | urlify.cn/J3MBby
一:什么是XML
XML (eXtensible Markup Language)指可擴展標(biāo)記語言,標(biāo)準(zhǔn)通用標(biāo)記語言的子集,簡稱XML。是一種用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言。
XML可以標(biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型,可以允許用戶對自己標(biāo)記語言進行自定義,是對人和機器都比較友好的數(shù)據(jù)承載方式;XML其前身是SGML(標(biāo)準(zhǔn)通用標(biāo)記語言)。
傳統(tǒng)的系統(tǒng)已經(jīng)遠(yuǎn)遠(yuǎn)不足以來表達復(fù)雜的信息,簡單的語言根本無法表達出一些細(xì)微的差別,需要更完整的語言來表達網(wǎng)絡(luò)世界里日益豐富復(fù)雜的信息內(nèi)涵
XML - 可擴展標(biāo)記語言便由此誕生,它不像HTML追求美觀的效果,而不重視實際交流應(yīng)用現(xiàn)象,所以XML語言的出現(xiàn)核心是用來展示及數(shù)據(jù)的交互,它的出現(xiàn)把網(wǎng)絡(luò)表達的語言集合推進了一大步,XML傳遞信息,具有跨平臺的特性(如:WebService)它作為數(shù)據(jù)交互和網(wǎng)絡(luò)計算基礎(chǔ),尤其是在電子商務(wù)應(yīng)用上的出色表現(xiàn),現(xiàn)在已經(jīng)沒人懷疑它給信息社會帶來的革命性影響(隨著2021的到來JSON也是一個不錯的選擇)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Students>
<Student>
<name>螞蟻小哥</name>
<address>安徽六安</address>
</Student>
<Student>
<name>歐陽康康</name>
<address>安徽六安</address>
</Student>
</Students>
1:編寫XML注意事項
①:XML 中的每個元素都是成對出現(xiàn)的,有開始和結(jié)束,自閉和標(biāo)簽除外,但是都得有 '/'結(jié)束標(biāo)志
如:<student>xxxxx</student> 自閉和:<student name='xxx' />
②:每個XML文檔都有且只有一個根元素(Root Element)
③:XML標(biāo)簽對大小寫敏感
④:XML必須正確嵌套
⑤:同級標(biāo)簽以所縮進對齊
⑥:元素名稱可以包含字母,數(shù)字,但不能以數(shù)字開頭
⑦:元素名稱中不能含有空格 或者 ' : '號
⑧:如出現(xiàn)特殊字符需要轉(zhuǎn)義 如:<,>,",',&....
2:使用XML的優(yōu)缺點
優(yōu)點:
①:XML是使用信息自描述的新語言(沒有約束的情況下)
②:信息共享(自定義數(shù)據(jù)格式,而且很容易使用工具讀寫)
③:數(shù)據(jù)傳遞(支持各種通道傳遞數(shù)據(jù),如WebService就使用XML傳輸數(shù)據(jù))
④:數(shù)據(jù)重用、分離數(shù)據(jù)和顯示、文檔包含語義、方便閱讀有面向?qū)ο蟮臉湫谓Y(jié)構(gòu)
缺點:
①:數(shù)據(jù)量大是傳輸效果不好,因為XML定義了和數(shù)據(jù)無關(guān)的標(biāo)簽
3:XML基本語法
第一行必須是XML的聲明<?xml ?>
version:xml的版本,必須設(shè)定,當(dāng)前只有'1.0'版本
encoding:當(dāng)前xml里面的數(shù)據(jù)格式,默認(rèn)UTF-8
standalone:標(biāo)記是否是一個獨立的xml,默認(rèn)yes
如果設(shè)置 no 表示這個XML不是獨立的而是依賴于外部的DTD約束文件(后面說)
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Students>
<Student>
<name>螞蟻小哥</name>
<address>安徽六安</address>
</Student>
</Students>

二:XML專用標(biāo)記
XML其實是有專用的標(biāo)記,也可以理解是XML的基本語法,但是這些語法你在看HTML語法時也看到過,因它們都屬于一個大家族,只是應(yīng)用的方向不一樣而導(dǎo)致的差異有部分不一樣
1:XML注釋
語法:<!-- 這是一個注釋 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<School>
<!--定義學(xué)生對象 這是一個注釋-->
<Student id="st01" name="張三" age="23"/>
</School>①:注釋里的內(nèi)容不要出現(xiàn) --②:不要把注釋寫在元素中間 如<Student <!--這里注釋報錯--> ></Student> ③:注釋不可嵌套2:XML處理PI指令
其實XML里的PI指令大家可以理解為XML設(shè)置樣式的,但是考慮到XML是用于存儲數(shù)據(jù)的載體,所以這個指令用的也不多
語法:<?目標(biāo) 指令?>
如引入CSS樣式:<?xml-stylesheet type='css類型' href='引入css樣式地址'>
CSS類型可以設(shè)置 type='text/css' type='text/xsl'
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!--引入PI指令 注意只能放在頭部 并引入style.css樣式-->
<?xml-stylesheet type='text/css' href='./style.css' ?>
<School>
<!--定義學(xué)生對象 這是一個注釋-->
<Student>
<name>螞蟻小哥</name>
</Student>
</School>
<!--CSS樣式-->
name {
font: normal 500 22px "微軟雅黑";
color:#f69;
}
3:XML之CDATA節(jié)
用于把整段文本解析為純字符串?dāng)?shù)據(jù)而不是標(biāo)記的情況,其實包含在CDATA節(jié)中的特殊字符<、>、&都會當(dāng)作字符展示
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<School>
<!--定義學(xué)生對象 這是一個注釋-->
<Student>
<!--使用<![CDATA[xxx]]>可以把特殊字符當(dāng)作文本-->
<name><![CDATA[我是一個"文本":想不到把]]></name>
</Student>
</School>
那么問題來的,如果我不使用CDATA節(jié)包裹的話在文本區(qū)域輸入<,>等就會和關(guān)鍵字符沖突,我們需要使用轉(zhuǎn)義
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<School>
<!--定義學(xué)生對象 這是一個注釋-->
<Student>
<!--這里的螞蟻小< > 哥報錯 <>干擾,我們要使用轉(zhuǎn)義-->
<!--<name>螞蟻小<>哥</name>-->
<name>螞蟻小<>哥</name>
</Student>
</School>
<!--常用網(wǎng)頁轉(zhuǎn)義字符 xml也可以使用-->
<!--
顯示結(jié)果 描述 實體名稱 實體編號
空格
< 小于號 < <
> 大于號 > >
& 和號 & &
" 引號 " "
' 撇號 '(IE不支持) '
¢ 分 ¢ ¢
£ 鎊 £ £
¥ 日圓 ¥ ¥
§ 節(jié) § §
? 版權(quán) ? ?
? 注冊商標(biāo) ? ?
× 乘號 × ×
÷ 除號 ÷ ÷
-->
XML中轉(zhuǎn)義字符的使用
三:核心DTD語法約束
1:什么是DTD,為什么使用DTD
DTD是文檔類型定義(Document Type Definiyion),它是用來描述XML文檔結(jié)構(gòu),一個DTD文檔會包含如下內(nèi)容:
元素(ELEMENT):的定義規(guī)則,描述元素之間的關(guān)系規(guī)則
屬性(ATTLIST):的定義規(guī)則,可以定義具體的標(biāo)簽內(nèi)部屬性
為什么使用DTD:
①:DTD文檔與XML文檔實例關(guān)系如類與對象關(guān)系
②:有了DTD,每個XML文件可以攜帶一個自身格式描述
③:有了DTD,不同組織的人可以使用一個通用DTD來交換數(shù)據(jù)
④:應(yīng)用程序可以使用一個標(biāo)準(zhǔn)的DTD校驗從外部世界接受來的XML是否是一個有效標(biāo)準(zhǔn)XML
⑤:可以使用DTD校驗自己的XML數(shù)據(jù)
2:DTD定義文檔規(guī)則(DOCTYPE)
DTD文檔的聲明及引用有三種:
內(nèi)部DTD文檔:
<!DOCTYPE 根元素[定義元素屬性等等內(nèi)容]>
外部DTD文檔:
<!DOCTYPE 根元素 SYSTEM 'DTD文件路徑'>
內(nèi)外部DTD文檔結(jié)合:
<!DOCTYPE 根元素 SYSTEM 'DTD文件路徑'[定義元素屬性等等內(nèi)容]>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!--注:此時我這里面的 ELEMENT 定義元素的我后面介紹-->
<!DOCTYPE Student[
<!ELEMENT Student (name)>
<!ELEMENT name (#PCDATA)>
]>
<Student>
<name>螞蟻小哥</name>
</Student>
內(nèi)部定義DTD文檔
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE Student SYSTEM './st.dtd'>
<Student>
<name>螞蟻小哥</name>
</Student>
<!--下面是文件 st.dtd-->
<!DOCTYPE Student[
<!ELEMENT Student (name)>
<!ELEMENT name (#PCDATA)>
]>
外部定義DTD文檔
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE Student SYSTEM './st.dtd'[
<!ELEMENT Student (name,age,sex)>
<!ELEMENT sex (#PCDATA)>
]>
<Student>
<name>螞蟻小哥</name>
<age>23</age>
<sex>男</sex>
</Student>
<!--外部引用的st.dtd文件-->
<?xml version="1.0" encoding="UTF-8" ?>
<!--這里不能寫DOCTYPE,因為這個可以當(dāng)作元素引用,具體規(guī)則在上面定義-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
內(nèi)外部定義DTD文檔3:DTD元素的定義(ELEMENT)
語法:<!ELEMENT 元素名稱(NAME) 元素類型(COUTENT)>
注:ELEMENT關(guān)鍵字
元素名稱:就是自定義的子標(biāo)簽名稱
元素類型:
EMPTY:該元素不能包含子元素和文本,但是可以有屬性,這類元素稱為自閉和標(biāo)簽
ANY:該元素可以包含任意在DTD中定義的元素內(nèi)容
#PCDATA:可以包含任何字符數(shù)據(jù),設(shè)置這個就不能包含子元素了,一般設(shè)置具體value
混合元素類型:只包含子元素,并且這些子元素沒有文本
混合類型:包含子元素和文本數(shù)據(jù)混合體
<!-- 定義空元素EMPTY -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE Student[
<!ELEMENT Student EMPTY>
]>
<!--約束為空元素 所以寫成自閉和標(biāo)簽,-->
<Student/>
<!-- 定義組合元素(student,teacher)并為每個元素設(shè)置類型(#PCDATA) -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE School[
<!ELEMENT School (student,teacher)>
<!ELEMENT student (#PCDATA)>
<!ELEMENT teacher (#PCDATA)>
]>
<School>
<student>我是學(xué)生</student>
<teacher>我是老師</teacher>
</School>
<!-- 設(shè)置任意元素ANY 雖然student元素內(nèi)部沒有再設(shè)置元素而設(shè)置ANY,那我就可以
在編寫任意子元素,前提在里面有定義 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE School[
<!ELEMENT School (student)>
<!ELEMENT student ANY>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
]>
<School>
<student>
<name>螞蟻小哥</name>
<address>安徽六安</address>
</student>
</School>
<!-- 元素組合及混合,可以使用通配符 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE School[
<!ELEMENT School (student*,teacher?)>
<!ELEMENT student (#PCDATA)>
<!ELEMENT teacher (#PCDATA)>
]>
<School>
<student>我是學(xué)生A</student>
<student>我是學(xué)生B</student>
</School>
DTD元素定義具體代碼
通配符:
() 用來元素分組如:(a|b|c),(d,e),f 分三組
| 在列表中選一個如(a|b)只能選一個 表示a|b必須出現(xiàn)并二選一
+ 該對象至少出現(xiàn)一次或多次如(a+) 該元素可以出現(xiàn)多次
* 該對象允許出現(xiàn)0次到多次如(a*) 該元素可以不出現(xiàn)或出現(xiàn)多次
? 表示可出現(xiàn)一次或者不出現(xiàn)(a?) a可以出現(xiàn),或者不出現(xiàn)
, 常用按照順序出現(xiàn)(a,b,c) 表示依次a,b,c4:DTD屬性的定義(ATTLIST)
語法:<!ATTLIST 元素名稱 屬性名稱 類型 屬性特點>
元素名稱:我們自定義的元素名稱
屬性類型:我們?yōu)樵厣咸砑幼远x屬性
類型:
CDATA:
任意字符(理解為任意字符的字符串)
ID:
以字母開頭唯一值字符串,
IDREF/IDREFS:
可以指向文檔中其它地方聲明的ID類型值(設(shè)置此值是可以在文檔上存在的)
使用IDREFS時可以使用空格隔開
NMTOKEN/NMTOKENS:
NMTOKEN是CDATA的一個子集,設(shè)置該屬性時只能寫英文字母、數(shù)字、句號、破折號
下劃線、冒號,但是屬性值里面不能有空格 NMTOKENS:它是復(fù)數(shù),如果設(shè)置多個值由空格隔開 Enumerated: 事先定義好一些值,屬性的值必須在所列出的值范圍內(nèi)
屬性特點:
#REQUIRED
表示必須設(shè)置此屬性
#IMPLIED
表示此屬性可寫可不寫
#FIXED value
表示元素實例中該屬性的值必須是指定的固定值
#Default value
為屬性提供一個默認(rèn)值
<!-- 第一種寫法 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE School[
<!ELEMENT School (student*)>
<!ELEMENT student EMPTY>
<!--定義了一個id屬性類型為ID 必須值-->
<!ATTLIST student id ID #REQUIRED>
<!--設(shè)置了name屬性 為任意字符的字符串 必須值-->
<!ATTLIST student name CDATA #REQUIRED >
<!--設(shè)置address 類型為多個常規(guī)字符串 且不需要一定存在此屬性-->
<!ATTLIST student address NMTOKENS #IMPLIED>
<!--設(shè)置srcID 該屬性的值只能從id上面上取-->
<!ATTLIST student srcID IDREFS #IMPLIED>
]>
<School>
<student id="st001" name="螞蟻小哥"/>
<student id="st002" name="歐陽;*)*^%$:小小" address="安徽_六安 安徽_合肥"/>
<student id="st003" name="許齡月" srcID="st001 st002"/>
</School>
<!-- 第二種寫法 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE School[
<!ELEMENT School (student*)>
<!ELEMENT student EMPTY>
<!--簡便寫法,全部放在一起寫-->
<!--設(shè)置了name屬性 為任意字符的字符串 不一定要設(shè)置此屬性,但是設(shè)置必須按照指定的值-->
<!ATTLIST student
id ID #REQUIRED
name CDATA #FIXED '我們名字都一樣'
address CDATA '默認(rèn)都是安徽'
sex (男|女) #REQUIRED
>
]>
<School>
<student id="st001" sex="男" name="我們名字都一樣"/>
<student id="st002" sex="女"/>
<student id="st003" sex="男" name="我們名字都一樣"/>
</School>
DTD的屬性定義具體代碼5:DTD實體定義(ENTITY)
實體分類:
普通內(nèi)部實體,普通外部實體,內(nèi)部參數(shù)實體,外部參數(shù)實體
語法:
普通內(nèi)部實體定義:<!ENTITY 實體名 "實體值">
普通外部實體引入:<!ENTITY 實體名 SYSTEM "URI/URL">
內(nèi)部參數(shù)實體定義:<!ENTITY % 實體名 "實體值">
外部參數(shù)實體引入:<!ENTITY % 實體名 SYSTEM "URI/URL">
示例定義:
<!ENTITY name "螞蟻小哥">
<!ENTITY address "安徽六安">
示例XML里使用:
<name>&name;</name>
使用范圍:定義實體分為內(nèi)部實體(定義在當(dāng)前xml文件)和外部實體(定義在外部dtd文件里)
<!-- 內(nèi)部普通實體 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE Student[
<!ELEMENT Student (name,address)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ENTITY name "螞蟻小哥">
<!ENTITY address "安徽六安">
]>
<Student>
<name>&name;</name>
<address>&address;</address>
</Student>
DTD實體定義代碼6:使用命名空間(Namespace)
避免元素名沖突,使用URL作為XML的Namespaces(這樣也有約束和提示好處)
語法:xmlns:[prefix]="URL" 元素和屬性都可以應(yīng)用命名空間
XML的元素名是不固定的,當(dāng)兩個不同類型的文檔使用同樣的名稱描述兩個不同類型的元素的時候就會出現(xiàn)命名沖突
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<h:table xmlns:h="http://www.w3.org/1999/xhtml">
<h:tr>
<h:td>名稱A</h:td>
<h:td>名稱B</h:td>
</h:tr>
</h:table>
四:核心Schema語法約束
1:什么是XML Schema
XML Schema描述了XML文檔的結(jié)構(gòu)。可以用一個指定的XML Schema來驗證某個XML文檔,以檢查該XML文檔是否符合其要求。XML Schema file的后綴名是“.XSD”;其核心和DTD一樣,XML Schema本身的底層約束就是用DTD寫的
DTD的局限性:
①:DTD不遵循XML的語法(編寫DTD用的一種語法,編寫XML還是用一種語法,對比不清晰)
②:DTD數(shù)據(jù)類型有限(元素里面定義類型就#PCDATA)
③:DTD不可擴展
④:DTD不支持命名空間(命名沖突)
Schema的新特性:
①:Schema基于XML語法
②:Schema可以用能處理XML文檔的工具處理,如Altova工具
③:Schema大大擴充了數(shù)據(jù)類型,可以自定義數(shù)據(jù)類型
④:Schema支持元素的繼承-Object-Oriented
⑤:Schema支持屬性組
總結(jié):XML Schema其作用和DTD一樣,都是驗證我們編寫的XML文檔是否具有有效性,只不過它提供了比DTD更強大的功能和更細(xì)粒度的數(shù)據(jù)類型,另外還可以在Schema中自定義數(shù)據(jù)類型,此外我們要注意Schema也是一個XML文件,而不是DTD,但是Schema自身約束由DTD約束
2:基本使用
<!-- myschema.xml文件 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個String類型的元素-->
<xs:element name="student" type="xs:string"/>
</xs:schema>
<!-- myxml.xml文件 -->
<?xml version="1.0" encoding="UTF-8" ?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
我是學(xué)生
</student>
xmlns:xs="http://www.w3.org/2001/XMLSchema":用于構(gòu)造約束schema元素和類型該怎么寫
xsi:noNamespaceSchemaLocation="myschema.xml":用來告知當(dāng)前的schema來自哪個文件
xs:是我們加入的命名空間前綴,如果不加,后面使用都不用xs:xxx來編寫,xs是自定義名字
學(xué)習(xí)Schema的基本路線
schema
element
attribute
group
attributeGroup
simpleType
simpleContent
complexType
補充:
choice
list
union
unique
sequence
restrction3:Schema元素(重要!!)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.6666.com/schoolSchemal">
</xs:schema>
定義約束:
①:所有的標(biāo)簽和屬性都是由schema文件來約束定義
②:所有的schema文件都需要有個命名空間(id),具體名稱為namespace
③:namespace的值由targetNamespace指定,它就是一個url(正常都是不存在此鏈接的,只是個類似id標(biāo)識)
④:引入官方Schema約束需要用到xmlns屬性 如 xmlns="xxxxx"
我們可以為每個xmlns加上前綴,這樣我們每次使用加上前綴標(biāo)識 如 xmlns:xs='xxxxx'
<School xmlns="http://www.6666.com/schoolSchemal"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemalLocation="http://www.6666.com/schoolSchemal myschema.xsd">
</School>
使用約束:
①:引入我們定義約束的xsd文件,如在上個文件上定義的targetNamespace唯一標(biāo)識
②:如果這個targetNamespace不是一個有效的約束地址我們就需要設(shè)置schemalLocation屬性
③:schemalLocation的定義是由W3C官方指定的,所以我們先要引入官方Schemal約束
④:然后通過引入的約束起個前綴,通過前綴調(diào)用,因為2個約束不起前綴會沖突
⑤:schemalLocation設(shè)置需要使用命名空間(我們設(shè)置的namespace)加上文件的具體約束文件路徑
屬性:
xmlns:
引用w3c官方的schema的約束,這里定義了各式各樣的schema元素標(biāo)簽
targetNamespace:
定義當(dāng)前編寫的約束文件的互聯(lián)網(wǎng)訪問地址,如果地址不存在那也沒事,只是一個標(biāo)識
schemalLocation:
具體的約束文件路徑,如果命名空間約束鏈接不存在,那么在命名空間鏈接后面加上本地約束路徑
補充:如果就是要導(dǎo)入一個本地的自定義schema約束不要命名空間的話
屬性:noNamespaceSchemaLocation 不使用命名空間,選用本地約束文件
<?xml version="1.0" encoding="UTF-8" ?>
<School xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
</School>
4:element標(biāo)簽元素
它的主要作用就是用來聲明一個元素的,就像DTD語法中的 <!ELEMENT xxx (#PCDATA)>
語法:<xs:element name="元素名稱" type="元素類型">
element常用屬性:
name:自己設(shè)置元素時必須指定元素名稱,如果是ref引用則不需要
type:設(shè)置元素類型,可以為普通類型、簡單類型、復(fù)雜類型
ref:引用外部定義好的element元素并通過name來引用
minOccurs:設(shè)置該元素最少出現(xiàn)幾次
maxOccurs:設(shè)置unbounded則不限次數(shù),還有就是自定義出現(xiàn)次數(shù)
substiutionGroup:設(shè)置當(dāng)前元素替代哪個其它元素,前提自己不能設(shè)置類型,引用別人類型
fixed:設(shè)置具體固定值不可改變,必須使用此值
default:默認(rèn)值
補充type基本類型:
duration:表示持續(xù)時間 string:字符串
dateTime:代表特定時間 boolean:真假值
time:代表特定時間,但是是每天重復(fù)的 decimal:代表特定精度數(shù)字
haxBinary:代表16進制數(shù) float:單精度32位浮點數(shù)
anyURI:代表一個URI,用來指定文件定位 double:雙精度64位浮點數(shù)
NOTATION:設(shè)置該屬性時只能寫英文字母、數(shù)字、句號、破折號、下劃線、冒號,但是屬性值里面不能有空格
########本案例使用element的name、type、ref、minOccurs、maxOccurs
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個name元素為string類型-->
<xs:element name="name" type="xs:string"/>
<!--定義的簡單類型likes 并設(shè)置enum屬性供選擇一個愛好-->
<xs:simpleType name="likes">
<xs:restriction base="xs:string">
<xs:enumeration value="爬山"/>
<xs:enumeration value="騎行"/>
<xs:enumeration value="打球"/>
<xs:enumeration value="跑步"/>
</xs:restriction>
</xs:simpleType>
<!--d定義一個復(fù)雜類型 student-->
<xs:complexType name="student">
<xs:sequence>
<!--引用我最上面定義好的name元素-->
<xs:element ref="name"/>
<!--定義一個likes元素并指定簡單類型-->
<xs:element name="likes" type="likes"/>
<!--定義女朋友元素,此標(biāo)簽最少出現(xiàn)一個最多出現(xiàn)次數(shù)不限unbounded(不限)-->
<xs:element name="girlfriend" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!--創(chuàng)建一個element元素student 并引用我自定義的student的復(fù)雜類型-->
<xs:element name="student" type="student"/>
</xs:schema>
<!-- 具體的xml使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<name>張三</name>
<likes>爬山</likes>
<girlfriend>許齡月</girlfriend>
<girlfriend>楊冪</girlfriend>
</student>
########本案例使用element的substitutionGroup、fixed、default
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義兩個元素-->
<!--substitutionGroup設(shè)置替代的元素,可以看出sname元素直接引用name,所以sname可以替代name-->
<xs:element name="name" type="xs:string"/>
<xs:element name="sname" substitutionGroup="name"/>
<!--定義一個元素并設(shè)置固定值fixed-->
<xs:element name="address" type="xs:string" fixed="安徽六安"/>
<!--創(chuàng)建一個element元素student 這里的復(fù)雜類型我直接寫在元素里-->
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element ref="name"/>
<xs:element ref="address"/>
<!--設(shè)置學(xué)校元素并初始化元素文本為安徽大學(xué)-->
<xs:element name="school" default="安徽大學(xué)" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- 具體的xml使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<sname>張三</sname>
<address>安徽六安</address>
</student>
element元素使用的基本示例5:group組元素
group作用就是把聲明好的元素組合到一起,以便能夠被放到一起,比如現(xiàn)在有student和teacher兩個根元素,里面還要特有的子元素,我可以把這2組元素分組,直接引用
語法:
定義:<xs:group name='組名稱'>屬于當(dāng)前組的元素</xs:group>
使用:<xs:group ref='引用的組名稱'/>
屬性:
name:定義group組的名稱
ref:引用指定的group
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個基本的base組 simpleType簡單類型后面會介紹,現(xiàn)在使用一下 -->
<xs:group name="base">
<!--設(shè)置元素順序-->
<xs:sequence>
<!--設(shè)置name元素-->
<xs:element name="name" type="xs:string"/>
<!--設(shè)置age元素 并限制年齡選擇 value > 0 && value < 100 -->
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minExclusive value="0"/>
<xs:maxExclusive value="100"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!--設(shè)置sex元素 并設(shè)置enum值為男女-->
<xs:element name="sex">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:group>
<!--學(xué)生元素組-->
<xs:group name="student">
<xs:sequence>
<!--引用基本組元素-->
<xs:group ref="base"/>
<!--學(xué)生定義特有元素成績-->
<xs:element name="grades" type="xs:float"/>
</xs:sequence>
</xs:group>
<!--老師元素組-->
<xs:group name="teacher">
<xs:sequence>
<xs:group ref="base"/>
<!--老師定義特有元素工資-->
<xs:element name="salary" type="xs:double"/>
</xs:sequence>
</xs:group>
<xs:element name="School">
<xs:complexType>
<xs:sequence>
<!--定義學(xué)生元素指定復(fù)雜類型-->
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:group ref="student"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!--定義老師元素指定復(fù)雜類型-->
<xs:element name="teacher">
<xs:complexType>
<xs:sequence>
<xs:group ref="teacher"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- 具體在xml文件里使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<School xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<student>
<name>王曉偉</name>
<age>23</age>
<sex>男</sex>
<grades>66.9</grades>
</student>
<teacher>
<name>張老師</name>
<age>33</age>
<sex>男</sex>
<salary>6500.0</salary>
</teacher>
</School>
group組元素使用示例6:attribute屬性元素
有些情況下我們并不想在元素上創(chuàng)建子元素,這時候我們把要存放的值當(dāng)屬性存放在屬性里也是可以的
語法:
定義:<xs:attribute name='屬性名稱' type='屬性類型'/>
使用:<xs:attribute ref='引用的屬性名稱' use='屬性模式'>
常用屬性:
name:定義屬性名稱
type:定義屬性的類型
ref:引用定義好的屬性
use:設(shè)置屬性模式
required:此屬性必須出現(xiàn)
optional:此屬性可出現(xiàn)可不出現(xiàn)
prohibited:此屬性不可出現(xiàn)(自己定義的卻不可以使用)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--建屬性age-->
<xs:attribute name="age" type="xs:integer"/>
<!--創(chuàng)建一個根元素-->
<xs:element name="School">
<!--設(shè)置復(fù)雜類型-->
<xs:complexType>
<!--按照順序-->
<xs:sequence>
<!--構(gòu)建一個student元素并設(shè)置復(fù)雜元素-->
<xs:element name="student" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<!--按照順序-->
<xs:sequence>
<!--創(chuàng)建UUID元素-->
<xs:element name="uuid" type="xs:string"/>
</xs:sequence>
<!--創(chuàng)建屬性name 必須創(chuàng)建xs:sequence下面,DTD歸檔的順序創(chuàng)建-->
<xs:attribute name="name" type="xs:string" use="required"/>
<!--引用屬性age 必須創(chuàng)建xs:sequence下面,DTD歸檔的順序創(chuàng)建-->
<xs:attribute ref="age" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- 在自己的XML中具體使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<School xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<student name="張三" age="33">
<uuid>h4jd8flr-4h38flsp-meofk5p3-smif64tr</uuid>
</student>
<student name="李四" age="34">
<uuid>h4jd8flr-4h38flsp-meofk5p3-smif64tr</uuid>
</student>
</School>
attribute屬性元素具體使用示例
7:attributeGroup屬性組元素
attributeGroup與attribute差不多,只是一個單獨存在,而現(xiàn)在介紹的是以組的形式存在的,我們引用一個組代表引用了幾個一組的屬性
語法:
定義:<xs:attributeGroup name='屬性名稱'>定義一組屬性</xs:attributeGroup>
使用:<xs:attributeGroup ref='引用的屬性名稱' />
常用屬性:
name:定義屬性名稱
ref:引用定義好的屬性
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--設(shè)置一個屬性組并指定一些屬性-->
<xs:attributeGroup name="studentAtt">
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="age" type="xs:integer" use="required"/>
<xs:attribute name="address" type="xs:string" use="optional"/>
</xs:attributeGroup>
<xs:element name="School">
<xs:complexType>
<!--School元素里使用屬性-->
<xs:attributeGroup ref="studentAtt"/>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- 在xml中使用上面約束 -->
<?xml version="1.0" encoding="UTF-8" ?>
<School xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml" name="安徽學(xué)院" age="66" address="安徽"/>
attributeGroup屬性組元素具體使用示例8:simpleType簡單類型元素
simpleType是用來定義簡單類型的,比如string、integer這些基本類型上加以簡答的升級成為簡單類型,比如在string上升級成一個字符串枚舉類型,簡單類型決定了元素和屬性的約束和相關(guān)信息
語法:
<simpleType name='簡單類型名稱'>編寫簡單類型規(guī)則</simpleType>
屬性:
name:簡單類型名稱(只有定義在全局時才有name)
具體內(nèi)容:
restriction(限制)
屬性:
base:設(shè)置基本類型
元素:
maxExclusive:設(shè)置數(shù)值型的最大值(不包含最大值)
minExclusive:設(shè)置數(shù)值型的最小值(不包含最小值)
maxInclusive:設(shè)置數(shù)值型的最大值
minInclusive:設(shè)置數(shù)值型的最小值
maxLength:設(shè)置字符串型的最大長度
minLength:設(shè)置字符串型的最小長度
fractionDigits:設(shè)置小數(shù)點位數(shù)(在decimal類型下使用)
totalDigits:設(shè)置小數(shù)總位數(shù)的最大長度(在decimal類型下使用)
enumeration:設(shè)置枚舉數(shù)值,和base類型保持一致
list(列表)
屬性:
itemType:設(shè)置列表的類型
union(組合)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義簡單類型枚舉 安徽的地址-->
<xs:simpleType name="AnhuiAddress">
<xs:restriction base="xs:string">
<xs:enumeration value="安徽六安"/>
<xs:enumeration value="安徽合肥"/>
<xs:enumeration value="安徽安慶"/>
</xs:restriction>
</xs:simpleType>
<!--定義簡單類型枚舉 上海的地址-->
<xs:simpleType name="ShanghaiAddress">
<xs:restriction base="xs:string">
<xs:enumeration value="上海浦東新區(qū)"/>
<xs:enumeration value="上海靜安區(qū)"/>
<xs:enumeration value="上海普陀區(qū)"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="student">
<!--元素按照順序-->
<xs:sequence>
<!--定義元素name 并設(shè)置name長度為2~4 -->
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:maxLength value="4"/>
<xs:minLength value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!--定義likes元素 并設(shè)置為列表類型 空格隔開-->
<xs:element name="likes">
<xs:simpleType>
<xs:list itemType="xs:string"/>
</xs:simpleType>
</xs:element>
<!--定義地址address元素-->
<xs:element name="address">
<xs:simpleType>
<!--組合 意思時說要么使用AnhuiAddress 要么使用ShanghaiAddress-->
<xs:union>
<xs:simpleType>
<xs:list itemType="AnhuiAddress"/>
</xs:simpleType>
<xs:simpleType>
<xs:list itemType="ShanghaiAddress"/>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!--定義Student元素并指定復(fù)雜類型為student-->
<xs:element name="Student" type="student"/>
</xs:schema>
<!-- 引用到自己編寫的xml里使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<name>螞蟻小哥</name>
<likes>騎行 爬山</likes>
<address>上海靜安區(qū) 上海浦東新區(qū)</address>
</Student>
simpleType簡單類型使用示例9:complexType復(fù)雜類型屬性
其實就是定義一個復(fù)合的類型,里面可以嵌套子元素,也可包含元素等等,它決定了一組元素和屬性值的約束和相關(guān)信息
語法:
定義:<complexType name='類型名稱'></xs:complexType>
引用:在type上直接引用類型名稱
屬性:
name:類型名稱
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個復(fù)雜類型-->
<xs:complexType name="student">
<!--按照順序定義元素-->
<xs:sequence>
<!--定義一個name元素-->
<xs:element name="name" type="xs:string"/>
</xs:sequence>
<!--屬性定義-->
<xs:attribute name="uuid" type="xs:string" use="optional"/>
</xs:complexType>
<!--定義一個Student元素 并為復(fù)雜類型-->
<xs:element name="Student" type="student"/>
</xs:schema>
<!-- 具體在xml中使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<name>螞蟻小哥</name>
</Student>
complexType復(fù)雜類型的使用示例
注:SimpleType類型元素沒有子元素,也沒有屬性;如果想定義子元素和屬性就必須使用復(fù)雜類型ComplexType
10:simpleContent簡單內(nèi)容元素
simpleContent這個元素是對復(fù)雜類型的一個簡單的限制,限制當(dāng)前復(fù)雜類型下面是否可以在包含子元素了和子屬性了,一旦設(shè)置了simpleContent的話就意味在復(fù)雜類型下不能有子元素了,但是設(shè)置對應(yīng)的simpleContent子元素是可以設(shè)置屬性值的
語法:
<xs:simpleContent>里面設(shè)置約束內(nèi)容</xs:simpleContent>
子元素:
extension(擴大):設(shè)置此元素后可以設(shè)置屬性,但是不能設(shè)置子元素
base:當(dāng)前元素中文本的類型
restriction(限制):設(shè)置此元素后就代表此元素只能設(shè)置文本,無子元素和子屬性
base:限制的類型
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個復(fù)雜類型-->
<xs:complexType name="student">
<!--一旦設(shè)置這個就代表此元素下不包含子元素了-->
<xs:simpleContent>
<!--設(shè)置元素中的文本內(nèi)容必須為decimal類型-->
<xs:extension base="xs:decimal">
<!--定義了兩個屬性 為name 和 address-->
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="安徽六安"/>
<xs:enumeration value="安徽合肥"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!--定義第二個復(fù)雜類型 但是我不使用-->
<xs:complexType name="defaultType">
<!--這個既沒有子元素也沒有子屬性-->
<xs:simpleContent>
<xs:restriction base="xs:string">
<xs:enumeration value="安徽六安"/>
<xs:enumeration value="安徽合肥"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
<!--定義一個Student元素 并為復(fù)雜類型-->
<xs:element name="Student" type="student"/>
</xs:schema>
<!-- 在xml文件中使用上面約束 -->
<?xml version="1.0" encoding="UTF-8" ?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml" name="螞蟻小哥">
12.6
</Student>
simpleContent簡單限制的基本使用示例
注:SimpleContent用于ComplexType元素上,用于限定該ComplexType的內(nèi)容類型,表示該ComplexType沒有子元素,但是可以在里賣弄的extension元素里設(shè)置屬性,如果沒屬性和沒子元素,那么當(dāng)前的類型和SimpleType一樣
11:choice元素(補充)
這個元素的主要功能是運行唯一一個元素從一個組中被選擇
語法:
<xs:complexType name='復(fù)雜類型名稱'>
<xs:choice minOccurs='最少出現(xiàn)元素' maxOccurs='最大出現(xiàn)元素'>里面定義元素</xs:choice>
</xs:complexType>
屬性:
minOccurs:當(dāng)前在里面定義的全部元素至少使用設(shè)置的值
maxOccurs:當(dāng)前在里面定義的全部元素最多使用設(shè)置的值
unbounded:可取值無限,可全部使用,
數(shù)值:定義上限使用幾個
假設(shè):minOccurs="1" maxOccurs="4"
最少要在內(nèi)部選擇使用一個元素,并且使用不要超過4個
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個Student的元素-->
<xs:element name="Student">
<!--定義一個復(fù)雜類型-->
<xs:complexType>
<!--定義一個選擇元素-->
<xs:choice minOccurs="1" maxOccurs="3">
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="sex" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- 在xml中使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml" >
<name>張三</name>
<address>安徽六安</address>
<age>22</age>
</Student>
choice元素的基本使用示例
12:sequence元素(補充)
此元素是用于給一個元素一個特定的序列(順序),在寫complexType復(fù)雜類型時我們會經(jīng)常定義
語法:
<xs:complexType name='復(fù)雜類型名稱'>
<xs:sequence minOccurs='最少出現(xiàn)元素' maxOccurs='最大出現(xiàn)元素'>里面定義元素</xs:sequence>
</xs:complexType>
屬性:
minOccurs:當(dāng)前內(nèi)部定義的全部元素為一組,如果值為2就代表必須順序使用至少2遍
maxOccurs:如果值為4就代表必須順序使用不超過4遍
unbounded:可取值無限,可全部使用,
數(shù)值:定義上限使用幾個
假設(shè):minOccurs="1" maxOccurs="4"
最少要在內(nèi)部實現(xiàn)2遍元素,并且使用不要超過4遍(必須順序使用)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--定義一個Student的元素-->
<xs:element name="Student">
<!--定義一個復(fù)雜類型-->
<xs:complexType>
<xs:sequence minOccurs="1" maxOccurs="2">
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<!-- 在xml中使用 -->
<?xml version="1.0" encoding="UTF-8" ?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<name>張三</name>
<age>22</age>
<name>張三</name>
<age>22</age>
</Student>
sequence元素具體使用示例
13:小試牛刀練習(xí)一下吧(總結(jié)上面內(nèi)容)
對照下面的XML來寫出一個Schema
<?xml version="1.0" encoding="UTF-8" ?>
<School xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="myschema.xml">
<!--定義一組學(xué)生-->
<Students>
<!--學(xué)生實例 可以出現(xiàn)多個學(xué)生 屬性ID為id類型-->
<student id="st001">
<!--名稱限制2~4字符-->
<name>螞蟻小哥</name>
<!--性別枚舉 男|女-->
<sex>男</sex>
<!--年齡限制integer 20~50 -->
<age>25</age>
<!--家庭住址-->
<address value="安徽六安"/>
<!--愛好 使用list-->
<hobbys>爬山 競走 排球 籃球</hobbys>
<!--成績 保留一位小數(shù)點-->
<grades>97.5</grades>
</student>
</Students>
<Teachers>
<teacher id="te001">
<name>張老師</name>
<sex>女</sex>
<age>35</age>
<address value="安徽合肥"/>
<!--工資 最高不能超過6位數(shù),小數(shù)點保留2位-->
<salary>6050.55</salary>
<!--工作類型-->
<jobType>
<job>英語老師</job>
</jobType>
<jobType>
<job>數(shù)學(xué)老師</job>
</jobType>
</teacher>
</Teachers>
<!--定義學(xué)校信息-->
<Message msg="安徽電子信息學(xué)院" address="安徽蚌埠"/>
</School>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!--基本的元素組-->
<xs:group name="baseElement">
<xs:sequence>
<!--定義name元素 并設(shè)置簡單類型字符串長度為2~4-->
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="2"/>
<xs:maxLength value="4"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!--定義sex元素 并且設(shè)置置簡單類型enum枚舉為男|女-->
<xs:element name="sex">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="男"/>
<xs:enumeration value="女"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!--設(shè)置age元素 并設(shè)置簡單類型數(shù)值范圍為20~50-->
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:maxInclusive value="50"/>
<xs:minInclusive value="20"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!--設(shè)置address元素 并里面是value屬性-->
<xs:element name="address">
<xs:complexType>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:group>
<!--定義復(fù)雜類型students-->
<xs:complexType name="students">
<xs:sequence>
<xs:element name="student">
<xs:complexType>
<!--順序展示元素-->
<xs:sequence>
<!--引入基本復(fù)雜類型-->
<xs:group ref="baseElement"/>
<!--設(shè)置愛好元素 并設(shè)置為字符串列表類型-->
<xs:element name="hobbys">
<xs:simpleType>
<xs:list itemType="xs:string"/>
</xs:simpleType>
</xs:element>
<!--設(shè)置成績元素并且設(shè)置小數(shù)點保留一位-->
<xs:element name="grades">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<!--設(shè)置屬性id 為ID類型-->
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!--定義復(fù)雜類型teachers-->
<xs:complexType name="teachers">
<xs:sequence>
<xs:element name="teacher">
<xs:complexType>
<xs:sequence>
<xs:group ref="baseElement"/>
<!--設(shè)置工資元素 并且最高不超過6位,小數(shù)點為2位-->
<xs:element name="salary">
<xs:simpleType>
<xs:restriction base="xs:decimal">
<xs:totalDigits value="6"/>
<xs:fractionDigits value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<!--設(shè)置jobType工作類型元素 并且是個復(fù)雜類型 出現(xiàn)次數(shù)不限-->
<xs:element name="jobType" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="job" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<!--設(shè)置屬性id 為ID類型-->
<xs:attribute name="id" type="xs:ID" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!--定義復(fù)雜類型school-->
<xs:complexType name="school">
<!--定義順序 Students -> Teacher -> Message 按照順序-->
<xs:sequence>
<!--定義一個Students元素 引用students復(fù)雜類型-->
<xs:element name="Students" type="students"/>
<!--定義一個Teachers元素 引用teachers復(fù)雜類型-->
<xs:element name="Teachers" type="teachers"/>
<!--定義Message元素并設(shè)置2個屬性msg和address-->
<xs:element name="Message">
<xs:complexType>
<xs:attribute name="msg" type="xs:string" use="required"/>
<xs:attribute name="address" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!--創(chuàng)建元素School并指定為school類型-->
<xs:element name="School" type="school"/>
</xs:schema>
具體練習(xí)的Schema代碼


