1.常見用途
(1) 數據傳送通用格式
比如qq之間的數據傳送做案例進行詳細講解,用xml格式來傳送數據,具有良好的可讀性性,可維護性。
(2)配置文件
xml文件做配置文件可以說非常的普遍,比如我們的tomcat服務器的server.xml ,web.xml 。 在比如我們的struts中的struts-config.xml文件,和hibernate的hibernate.cfg.xml .....
(3) 充當小型數據庫
xml文件做小型數據庫,也是不錯的選擇,我們程序中可能用到一些經常要人工配置的數據,如果放在數據庫中讀取不合適(因為你要增加維護數據庫工作),則可以考慮直接用xm來做小型數據庫【比如msn中保存用戶聊天記錄就是用xml文件的】,而且直接讀取文件顯然要比讀取數據庫快。
2.Xml語法
入門案例: 用xml來記錄一個班級信息

1 <?xml version="1.0" encoding="utf-8"?> 2 <xml-body> 3 <class> 4 <stu id="001"> 5 <name>楊過</name> 6 <sex>男</sex> 7 <age>30</age> 8 </stu> 9 <stu id="002"> 10 <name>李莫愁</name> 11 <sex>女</sex> 12 <age>20</age> 13 </stu> 14 </class> 15 </xml-body>
☞ 編碼問題:
ansi 是 american national standard insititu 美國國家標准協會 。
ansi 編碼在不同的國家是不一樣的,更確切的說是和操作系統的語言是一直的,例如我們現在用的操作系統是簡體中文版,即gb2312,則此時ansi編碼的表現形式就是gb2312。但是如果你使用的是繁體中文則ansi的表現形式就是gbk或者big5。如果你使用的操作系統韓語版的,則ansi的表現則為韓文操作系統默認的編碼。所以在xml中定義編碼(encoding)的時候,一定要和文件的編碼方式一直,否則會出錯:
(1) 文檔聲明
<?xml version=”1.0” encoding=”編碼方式” standalone=”yes|no”?>
XML聲明放在XML文檔的第一行
XML聲明由以下幾個部分組成:
version - -文檔符合XML1.0規范,我們學習1.0
encoding - -文檔字符編碼,比如”gb2312”
standalone - -文檔定義是否獨立使用
standalone="yes“
standalone=“no” 默認
(2) 一個xml 文檔中,有且只有一個根元素(元素==標簽==節點)
(3) 對於XML標簽中出現的所有空格和換行,XML解析程序都會當作標簽內容進行處理。例如:下面兩段內容的意義是不一樣的:
<name>xiaoming</name>
不等價與
<name> xiaoming </name>
由於在XML中,空格和換行都作為原始內容被處理,所以,在編寫XML文件時,要特別注意。
(4) 屬性值用雙引號(")或單引號(')分隔(如果屬性值中有',用"分隔;有",用'分隔),一個元素可以有多個屬性,它的基本格式為:<元素名 屬性名="屬性值">
特定的屬性名稱在同一個元素標記中只能出現一次,屬性值不能包括<, >, &
特別說明: 如果屬性值有單引號,又有雙引號,則需要使用實體: html-> ©
特殊字符 | < | > | & | " | ' |
---|---|---|---|---|---|
實體 | < | > | & | " | ' |

1 <?xml version="1.0" encoding="utf-8"?> 2 <xml-body> 3 <class> 4 <stu id="a"0'0'1"> 5 <name>楊過</name> 6 <sex>男</sex> 7 <age>30</age> 8 </stu> 9 <stu id="002"> 10 <name>李莫愁</name> 11 <sex>女</sex> 12 <age>20</age> 13 </stu> 14 </class> 15 </xml-body>
一個XML元素可以包含字母、數字以及其它一些可見字符,但必須遵守下面的一些規范:
區分大小寫,例如,<P>和<p>是兩個不同的標記。
不能以數字或"_" (下划線)開頭。
不能包含空格。
名稱中間不能包含冒號(:)。
(5) CDATA節
有些內容可能不想讓解析引擎解析執行,而是當作原始內容處理,用於把整段文本解釋為純字符數據而不是標記的情況。包含大量<、>、&或者"字符。CDATA節中的所有字符都會被當作元素字符數據的常量部分,而不是XML標記。
語法:
<![CDATA[
……
]]>
可以輸入任意字符(除]]>外),不能嵌套
有時我們希望傳遞一些特殊字符, <>@!#$%^&*( 可以使用 CDATA節包括)
<intro><![CDATA[這個是好$$128qw8o8<Lk;>;akdf0sa98u329408><<K>>>學生]]></intro>
面試題:
問; 如何適用xml 去傳遞小圖片
答: 可以把文件讀取成一個byte[] ,然后放到 CDATA節,再傳遞.
xml語法小結:
XML聲明語句
<?xml version="1.0" encoding="gb2312"?>
必須有且僅有一個根元素
標記大小寫敏感
屬性值用引號
標記成對
空標記須關閉
元素正確嵌套
名稱中可以包含字母、數字或者其它字符
名稱中不能含空格
名稱中不能含冒號(注:冒號留給命名空間使用)
3. dtd(xml文件約束)
3.1基本概念
dtd ( document type definition 文檔類型定義),該文件一般和xml文件配合使用, 主要的用途是約束xml, 除了dtd 技術外,還有一個schema的技術也可以用於約束xml文件的書寫規范.
3.2問題引出及解決:

1 <?xml version="1.0" encoding="utf-8"?> 2 <xml-body> 3 <class> 4 <stu id="a"0'0'1"> 5 <name>楊過</name> 6 <sex>男</sex> 7 <age>30</age> 8 <面積>100平方</面積> 9 </stu> 10 <stu id="002"> 11 <name>李莫愁</name> 12 <sex>女</sex> 13 <age>20</age> 14 </stu> 15 </class> 16 </xml-body>
怎么能給一個人添加一個面積元素呢?由於現在的xml處於自由狀態,沒有受到任任何約束,所以想怎么寫就怎么寫,所以就可以使用dtd來限制它。
解決xml過於自由的問題:->dtd
3.3 dtd和xml的關系:
3.4 dtd元素
3.4.1語法
示例:

1 <!ELEMENT family (person+)> 2 <!ELEMENT person EMPTY>

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE family SYSTEM "dtdTest.dtd"> 3 <family> 4 <person></person><!-- 正確 --> 5 <person><name>zhangsan</name></person><!-- 錯誤 --> 6 </family>
因為我們設定person元素必須為空。而在xml文件中我們給它添加了子元素。

1 <!ELEMENT family (person+)> 2 <!ELEMENT parent (#PCDATA)> 3 <!ELEMENT person ANY>

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE family SYSTEM "dtdTest.dtd"><!-- 術語dtd的引入,后面會講到 --> 3 <family> 4 <person></person><!-- 正確 --> 5 <person>zhangsan</person><!--正確,表示,ANY包含字符串--> 6 <person><parent>zhanger</parent></person><!-- 正確,因為parent在dtd中有定義--> 7 <person><parent><person>zhanger</person></parent></person><!-- 錯誤,因為parent被定義為只能含有字符串不能含有dtd中定義的元素 --> 8 <person><name>zhangsan</name></person><!-- 錯誤,因為name在dtd中沒有定義 --> 9 </family>
3.4.2 dtd的元素的修飾符
3.5 dtd元素屬性
基本語法
屬性的類型有五種:
CDATA 表示可以放入文本
ID 表示屬性的值,不能重復,同時不要用數字開頭.
IDREF/IDREFS 當一個元素的屬性值,需要去引用另外一個ID ,則使用IDREF,如果希望引用多個,則使用IDREFS,請用空格隔開.
Enumerated 表示屬性的值,只能是例舉出了的。
屬性的特點有四種
#REQUIRED 表示必須有
#IMPLIED 表示可以有
#FIXED “值” 表示如果有,則必須是什么
Default “值” 表示如果不指定,則默認.
如:

1 <!ELEMENT family (person+)> 2 <!ELEMENT person ANY> 3 <!ATTLIST person 4 name ID #REQUIRED 5 sex (male|female) #REQUIRED 6 address CDATA #FIXED "福州" 7 father IDREF #IMPLIED 8 mother IDREF #IMPLIED 9 son CDATA "not has son" 10 >

1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE family SYSTEM "dtdTest.dtd"><!-- 術語dtd的引入,后面會講到 --> 3 <family> 4 <person name="father" sex="male"/> 5 <person name="mother" sex="female"/> 6 <person name="son" sex="male" father="father" mother="mother"/> 7 </family>
實體(ENTITY)
實體用於為一段內容創建一個別名,以后在XML文檔中就可以使用別名引用這段內容了。
就像在java 中,我們定義了一個字符串:
String str=”你好”;
這樣,在別的地方,我們使用str就可以訪問到 ‘你好’
在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。
實體可分為兩種類型:引用實體和參數實體。
引用實體
引用實體主要在 XML 文檔中被應用
語法格式(dtd中定義):
<!ENTITY 實體名稱 “實體內容”>
引用方式(xml中引用)
&實體名稱;
案例
在 dtd 中定義:
<!ENTITY mycopy "我的公司版權">
注:最好把定義放在dtd的最后
在xml中使用:
&mycopy;
參數實體
參數實體被 DTD 文件自身使用
語法格式:
<!ENTITY % 實體名稱 "實體內容" >
引用方式:
%實體名稱;
示例1:
示例2:
<!ENTITY % 實體名稱 "實體內容" >

1 <!ELEMENT 班級 (學生*)> 2 <!ENTITY % myname "名字"> 3 <!ELEMENT 學生 (%myname;,介紹,年齡)> 4 <!ATTLIST 學生 5 地址 CDATA #FIXED "北京" 6 學號 ID #REQUIRED 7 大哥 IDREFS #REQUIRED 8 性別 (男|女) #REQUIRED 9 > 10 <!ELEMENT %myname; (#PCDATA)> 11 <!ELEMENT 年齡 (#PCDATA)> 12 <!ELEMENT 介紹 (#PCDATA)> 13 14 <!ENTITY mycopy "我的公司版權">
3.6 快速入門案例
Xml1.dtd

1 <!ELEMENT 班級 (學生+)><!--表示:班級元素內含有至少一個學生元素--> 2 <!ELEMENT 學生 (名字,年齡,介紹)><!--表示:學生元素內可以含有名字,年齡,介紹等屬性--> 3 <!ELEMENT 名字 (#PCDATA)><!--表示:名字屬性的值可以包含任何字符串,但是不能含有定義在該dtd中的其他元素--> 4 <!ELEMENT 年齡 (#PCDATA)> 5 <!ELEMENT 介紹 (#PCDATA)>
Xml1.xml

1 <?xml version="1.0" encoding="utf-8"?> 2 <!--引入dtd去約束該xml文件--> 3 <!DOCTYPE 班級 SYSTEM "myClass2.dtd"> 4 <班級> 5 <學生> 6 <名字>周星馳</名字> 7 <年齡>23</年齡> 8 <介紹>學習刻苦</介紹> 9 </學生> 10 <學生> 11 <名字>林青霞</名字> 12 <年齡>32</年齡> 13 <介紹>是一個好學生</介紹> 14 </學生> 15 </班級>
注:現在可能還看不懂一些里面的東西,我們后面會一一說明的。
編程校驗XML文檔正確性(xmlspy) :
IE5以上瀏覽器內置了XML解析工具:Microsort.XMLDOM,開發人員可以編寫javascript代碼,利用這個解析工具裝載xml文件,並對xml文件進行dtd驗證。
創建xml文檔解析器對象:

1 <html> 2 <head> 3 <title>xmlspy.html</title> 4 <!--自己編寫一個簡單的解析工具,去解析xml dtd 是否配套--> 5 <script language="javascript"> 6 var xmldoc = new ActiveXObject("Microsoft.XMLDOM"); 7 xmldoc.validateOnParse = "true";//開啟校驗 8 xmldoc.load("Xml1.xml");//指定校驗哪個xml文件 9 document.writeln("錯誤信息是:"+xmldoc.parseError.reason+"<br/>"); 10 document.writeln("錯誤的行是:"+xmldoc.parseError.line); 11 </script> 12 </head> 13 14 <body/> 15 </html>
這樣我們就可以檢測我們的xml是否有誤了:
由於,我們剛才寫的Xml1.xml是符合dtd規則的。所以該html顯示為:
隨着后面的講解,我們會把錯誤顯示出來的。
3.7 dtd 的分類
(1)內部 dtd

1 <?xml version='1.0' encoding='gb2312'?> 2 <!DOCTYPE poem[ <----------------根元素的名稱 3 <!ELEMENT poem (author,title,content) ><---------------------子元素的名稱及順序 4 <!ELEMENT author (#PCDATA)><------------------子元素的數據類型 5 <!ELEMENT title (#PCDATA)> 6 <!ELEMENT content (#PCDATA)> 7 ]> <------------------------結束標簽 8 9 <poem> 10 <author>王維</author> 11 <title>鹿柴</title> 12 <content>空山不見人,但聞人語聲. 13 返景入深林,復照青苔上. 14 </content> 15 </poem>
注意:例中的定義關鍵字一定要大寫,如DOCTYPE、ELEMENT、#PCDATA,且元素名稱與數據類型之間也要有空格。
(2)外部 dtd
dtd文件:

1 <?xml version="1.0" encoding="gb2312"?> 2 <!ELEMENT poem (author,title,content)> 3 <!ELEMENT author (#PCDATA)> 4 <!ELEMENT title (#PCDATA)> 5 <!ELEMENT content (#PCDATA)>
xml文件:

1 <? xml version='1.0' encoding='gb2312' ?> 2 <!DOCTYPE poem SYSTEM "ex2.dtd"> 3 <poem> 4 <author>王維</author> 5 <title>鹿柴</title> 6 <content>空山不見人,但聞人語聲.返景入深林,復照青苔上.</content> 7 </poem>
3.8 在xml中引入dtd 的方法
(1)內部dtd
不用引入。
(2)外部dtd
<1>引入本地 dtd
<!DOCTYPE 根元素 SYSTEM ‘地址’>
<2> 引入公共的 dtd
<!DOCTYPE 根元素 PUBLIC ‘url地址’>
<3>內外部dtd
<!DOCTYPE 根元素 SYSTEM "DTD文件路徑" [ 定義內容 ]>
3.9 學習dtd的目標
一般公司很少讓程序員自己寫 dtd,要求程序員看的懂dtd,同時可以根據給出的dtd,寫出對應的xml
3.10 DTD的局限性
DTD語法與XML語法存在差異;
缺少對XML名稱空間的支持;
缺少數據分類;
內容模型描述收到限制。
4. xml 命名空間
用途:XML 命名空間提供避免元素命名沖突的方法。
4.1 問題的引出
xml1.xml

1 <table> 2 <tr> 3 <td>Apples</td> 4 <td>Bananas</td> 5 </tr> 6 </table>
xml2.xml

1 <table> 2 <name>African Coffee Table</name> 3 <width>80</width> 4 <length>120</length> 5 </table>
當xml1.xml和xml2.xml放在一起使用的時候,我們便分不清,table到底代表xm1.xml中定義的還是xml2.xml中定義的那個。
因此,在 XML 中,當兩個不同的文檔使用相同的元素名,並且它們放在一起使用時,由於兩個文檔都包含帶有不同內容和定義的相同名稱的元素,就會發生命名沖突。
4.2 解決之道

1 <h:table xmlns:h="http://www.w3.org/TR/html4/"> 2 <h:tr> 3 <h:td>Apples</h:td> 4 <h:td>Bananas</h:td> 5 </h:tr> 6 </h:table> 7 8 <f:table xmlns:f="http://www.w3school.com.cn/furniture"> 9 <f:name>African Coffee Table</f:name> 10 <f:width>80</f:width> 11 <f:length>120</f:length> 12 </f:table>
4.3定義

1 xmlns:namespace-prefix="namespaceURI" 2 3 <h:table xmlns:h="http://www.w3.org/TR/html4/"> 4 <h:tr> 5 <h:td>Apples</h:td> 6 <h:td>Bananas</h:td> 7 </h:tr> 8 </h:table>
這樣我們就可以使用前綴h來限定元素的確切含義了。
默認命名空間的定義:

1 xmlns="namespaceURI" 2 <table xmlns="http://www.w3.org/TR/html4/"> 3 <tr> 4 <td>Apples</td> 5 <td>Bananas</td> 6 </tr> 7 </table>
注:用於標示命名空間的地址不會被解析器用於查找信息。其惟一的作用是賦予命名空間一個惟一的名稱。改地址有一個響亮的名字:URI(統一資源定位符)。URI最大的特點就是唯一性。
5. XML Schema(XSD)
XML Schema 是基於 XML 的 DTD 替代者。
XML Schema 語言也稱作 XML Schema 定義(XML Schema Definition,XSD)。
XSD能干什么:
定義可出現在文檔中的元素
定義可出現在文檔中的屬性
定義哪個元素是子元素
定義子元素的次序
定義子元素的數目
定義元素是否為空,或者是否可包含文本
定義元素和屬性的數據類型
定義元素和屬性的默認值以及固定值
由此可見,XSD比DTD厲害的多啊,那我們還需要DTD嗎?
非常需要!因為:(1)XSD沒有提供ENTITY功能。但是在很多的xml中ENTITY占有很重要的地位,如,RDF,OWL中;(2)DTD是XML推薦標准里唯一的定義和驗證方法。
遵守某個特定的XML Schema的XML文件稱為XML Schema的一個實例文檔。
5.1 快速入門
schema的功能和dtd的功能一樣,都是用來限制xml的。所以我需要在xml文件中插入schema文件的引用。為了能在編寫xml是得到只能提示,我就在的spring的配置文件(applicationContext.xml)里面編寫xml(應該有比較簡便的放xml智能提示,有知道的大俠,望不吝賜教):
首先在MyEclipse中新建一個web工程,並加入spring框架,applicationContext.xml一般在src目錄下,為了簡便起見,我們就在src目錄下創建我們的Schema文件——name.xsd,內容如下(先不要管內容是什么意思,后面會一一講解):

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <schema xmlns="http://www.w3.org/2001/XMLSchema" 4 5 xmlns:target="http://www.example.com/name" 6 7 targetNamespace="http://www.example.com/name" 8 9 elementFormDefault="qualified"> 10 11 <element name="name"> 12 13 <complexType> 14 15 <sequence> 16 17 <element name="first" type="string"/> 18 19 <element name="middle" type="string"/> 20 21 <element name="last" type="string"/> 22 23 </sequence> 24 25 <attribute name="title" type="string"/> 26 27 </complexType> 28 29 </element> 30 31 </schema>
然后打開實例文檔(applicationContext.xml),在這個文件里面編寫我們的待檢驗文件,首先引入Schema文件,
然后我們編寫xml文件時,便有提示功能:
通過編寫代碼來驗證xml文件的正確性:
Schema文檔中,element元素定義了實例文檔中可以含有的元素,attribute元素定義了實例文檔中特定元素含有的屬性,type屬性表示對應的實例文檔中對應的元素或屬性的類型。
5.2 <schema>聲明
XML Schema 文件的跟元素是<schema>該元素中包含如下屬性:
我們只說幾個重點的屬性:
首先來看version,這個屬性是一個非常簡單的屬性,用來標記XML Schema的版本。
targetNamespace(目標命名空間):XML Schema主要是用來聲明在其實例文檔中可以使用的詞匯的。而這些詞匯就是由targetNamespace屬性里指定的一個命名空間來標識的。當聲明一個targetNamespace屬性時,就一定要插入友好的命名空間聲明,如:
xmlns:target="http://www.example.com/name"
targetNamespace="http://www.example.com/name"
或者使用默認命名空間聲明,如:
<xsd:schema xmlns="http://www.example.com/name" targetNamespace="http://www.example.com/name"
elementFormDefault、attributeFormDefault表示元素或屬性的限定方式,有兩種即限定和不限定。如果一個元素或者屬性關聯到一個命名空間,就是限定的。反之則是不限定的。如,下面就是限定的:

1 <n:name title="Mr."> 2 <n:first>Jone</n:first> 3 <n:middle>hello</n:middle> 4 <n:last>Doe</n:last> 5 </n:name> 6 <n:name></n:name> 7 8 <name xmlns="http://www.example.com/name"> 9 <first>Jone</first> 10 <middle>hello</middle> 11 <last>Doe</last> 12 </name>
非限定的就比如:

1 <n:name title="Mr."> 2 <first>Jone</first> 3 <middle>hello</middle> 4 <last>Doe</last> 5 </n:name>
利用這兩個屬性就可以控制實例文檔中元素和屬性的默認限定值。它們默認值都為"unqualified"(非限定的)。
5.3 <element>聲明
(1)元素的類型
元素的內容的類型是有type屬性決定的。根據類型定義的位置的不同,該類型可分為兩種:全局類型與局部類型。
Schema中其他的聲明也一樣,根據定義的位置的不同可分為全局聲明和局部聲明。
全局聲明:<schema>為其直接父親,可以在整個XML Schema中被重用。
局部什么:<schema>為其祖先但並非直接父親,只能在指定的上下文中使用。
(2)默認值和固定值
我們可以通過default和和fixed屬性為元素設定默認值和固定值。如:
1 <xsd:element name="last" type="xsd:string" default="Doe"/>
則在實例文檔中
<last></last>或者<last/>
將被解析為<last>Doe</last>
當我們希望某些元素的值不能變化的時候就用fixed將其設定為固定值。
1 <xsd:element name="version" type="xsd:string" fixed="1.0"/>
這時,實例文件中如下的形式是合法的:

1 <version>1.0</version> 2 <version></version> 3 <version/>
下面的形式就是非法的:
1 <version>2.0</version>
(3)元素通配符
包含任何命名空間中的元素的聲明稱為通配符。利用通配符可以把一個命名空間里的任何一個元素插入到XML Schema中。
聲明一個元素通配符要用到<any>,它只能聲明在內容模型中,不允許創建全局<any>。<any>聲明還可以用來控制元素來自哪個或那些命名空間,為此需要namespace屬性,namespace的允許取值為:
我們還可以通過processContents屬性來指示模式驗證器采用何種方式驗證實例文檔:
strict(默認值):處理器驗證通配符元素。如果驗證器找不到通配符元素的全局XML Schema定義,則模式驗證器報錯;
lax:如果處理器可以訪問到通配符的全局XML Schema定義,則驗證這些通配符元素;
skip:處理器將忽略實例文檔中所有的通配符元素。
5.4 <attribute>聲明
屬性的聲明格式如下:
與元素一樣,屬性也可以分為全局屬性和局部屬性。定義方式和定義元素的一樣。
(1)屬性的使用
通過use屬性來指定屬性在實例文檔中出現的方式:
required:必須出現
prohibited:禁用的
optional(默認值):可以出現也可以不出現
如果我們為一個屬性定義了默認值,那么use的取值就不能是required和prohibited了。
(2)屬性通配符
和元素通配符一樣。用來包括來自一個命名空間的任何屬性的聲明稱為屬性通配符。
聲明一個屬性通配符:
它只能聲明在<complexType>或者<attributeGroup>聲明內,不能建立全局<anyAttribute>聲明。
其中,namespace的允許取值:
processContents屬性的用途及機制和屬性的一樣。
例,希望包含任何非限定屬性以及來自http://www.w3.org/XML/1998/namespace命名空間的屬性。用屬性通配符實現如下:

1 <xsd:complexType> 2 <xsd:sequence> 3 <xsd:element name="first" type="xsd:string" /> 4 <xsd:element name="middle" type="xsd:string" /> 5 <xsd:element name="last" type="xsd:string" default="Doe"/> 6 <xsd:any namespace="##any" processContents="strict"/> 7 </xsd:sequence> 8 <xsd:anyAttribute namespace="##local http://www.w3.org/XML/1998/namespace" processContents="lax"/ ></xsd:anyAttribute> 9 </xsd:complexType>
5.5 Schema中的類型
Schema中主要包括三種部件:元素(element)、屬性(attribute)、注釋(notation)。
這三種基本的部件還能組合成以下的部件:
a)類型定義部件: 簡單類型和復合類型
b)組部件
c)屬性組部件
5.5.1 簡單類型

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 3 <xs:element name="quantity" type="xs:nonNegativeInteger"></xs:element> 4 </xs:schema>
XML Schema中定義了一些內建的數據類型,這些類型可以用來描述元素的內容和屬性值。
定義:一個元素中如果僅僅包含數字、字符串或其他數據,但不包括子元素,這種被稱為簡單類型。如同上述代碼中元素quantity就是一個簡單類型。它的元素內容必須是非負整數,不包括任何屬性和子元素。
所有內建的簡單類型
原始類型
string,boolean,decimal,float,double,duration,datetime,time,date,gYearMonth,gYear,gMonthDay,dDay,gMonth,hexBinary,base64Binary,any URI,QNameNOTATION
衍生類型(括號中為基類型)
normalizedString(string),language(tonken),token(normalizedString),NMTOKEN(token),Name(token),NCName(Name),ID(NCName),IDREF(NCName),IDREFS(list of IDREF),ENTITY(NCName),ENTITIES(list of ENTITY),integer(decimal),nonPositiveInteger(integer),negativeInteger(noPositiveInteger),long(integer),int(long),short(int),byte(short),nonNegativeInteger(integer),unsignedLong(nonNegativeInteger),unsignedInt(unsignedLong),unsignedShort(unsignedInt),unsignedByte(unsignedShort),positiveInteger(nonNegativeInteger)
創建簡單類型

1 <?xml version="1.0" encoding="UTF-8"?> 2 <schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 3 <simpleTypye name="quantityType"> 4 <restriction base='integer'> 5 <minInclusive value="2"/> 6 <maxInclusive value="5"/> 7 </restriction> 8 </simpleTypye> 9 <element name="quantity" type="quantityType"/> 10 </schema>
我們先創建了一個簡單類型:quantityType,它是從integer繼承過來的,minInclusive和maxInclusive定義了它的最小值2和最大值5。最后我們定義元素quantity的類型為quantityType。

1 <!--正確--> <quantity>3</quantity> 2 <!--錯誤--> <quantity>10</quantity> 3 <!--錯誤--> <qauntity>aaa</quantity>
使用restriction我們可以限制只能接受一定數值或者只能接受一定文字,
基本方面:equal,ordered,bounded,cardinality,numeric 限制方面:length,minLength,maxLength,pattern,enumeration,whiteSpace,maxInclusive,maxExclusive,minInclusive,minExclusive,totalDigits,fractionDigits
例1:

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 3 <xsd:simpleType name="ChinaCity"> 4 <xsd:restriction base="xsd:string"> 5 <xsd:enumeration value="BeiJing"/> 6 <xsd:enumeration value="FuZhou"/> 7 <xsd:enumeration value="LanZhou"/> 8 <!-- and so on --> 9 </xsd:restriction> 10 </xsd:simpleType> 11 <element name="cityname" type="ChinaCity"/> 12 </schema>
通過enumeration來列出所有的城市名稱,取值是只能取里面列出的城市名。

1 <cityname>BeiJing</cityname><!-- 正確 --> 2 <cityname>FuZhou1</cityname><!-- 錯誤 -->
5.5.2 列表類型

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsd:schema xmlns="http://www.test.cn" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <xsd:simpleType name="listOfIntType"> 5 <xsd:list itemType="xsd:int"></xsd:list> 6 </xsd:simpleType> 7 <element name="IntList" type="listOfIntType"/> 8 </schema>
list可以用來定義列表類型,listOfIntType這個類型被定義為一個xsd:int的列表,元素IntList的值可以是幾個整數,它們之間使用空格隔開。
正確: <listOfMyInt>1 5 15037 95977 95945</listOfMyInt>
錯誤: <listOfMyInt>1 3 abc</listOfMyInt>
5.5.3 聯合類型

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsd:schema xmlns="http://www.test.cn" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <xsd:simpleType name="ChinaCity"> 5 <xsd:restriction base="xsd:string"> 6 <xsd:enumeration value="BeiJing"/> 7 <xsd:enumeration value="FuZhou"/> 8 <xsd:enumeration value="LanZhou"/> 9 <!-- and so on --> 10 </xsd:restriction> 11 </xsd:simpleType> 12 <xsd:simpleType name="listOfIntType"> 13 <xsd:list itemType="xsd:int"></xsd:list> 14 </xsd:simpleType> 15 <xsd:simpleType name="zipUnion"> 16 <xsd:union memberTypes="ChinaCity listOfIntType"/> 17 </xsd:simpleType> 18 <element name="zips" type="zipUnion"/> 19 </schema>
用union來定義了一個聯合類型,里面的成員類型包括ChinaCity和listOfIntType,應用了聯合類型的元素的值可以是這些原子類型或列表類型中的一個類型的實例,但是一個元素實例不能同時包含兩個類型。

1 <!--正確--> 2 <zips>CA</zips> 3 <zips>95630 95977 95945</zips> 4 <zips>AK</zips> 5 6 <!--錯誤--> 7 <zips>CA 95630</zips>
5.5.4匿名類型定義

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsd:schema xmlns="http://www.test.cn" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <xsd:element name="quantity"> 5 <xsd:simpleType> 6 <xsd:restriction base="xsd:positiveInteger"> 7 <xsd:maxExclusive value="100"/> 8 </xsd:restriction> 9 </xsd:simpleType> 10 </xsd:element> 11 </schema>
前面我們在定義元素類型時總是先定義一個數據類型,然后再把元素的type設成新定義的數據類型。如果這個新的數據類型只會用一次,我們就可以直接設置在元素定義里面,而不用另外來設置。如圖中元素quantity的類型就是一個從1到99的整數。
這種新的類型沒有自己的名字的定義方法我們稱之為匿名類型定義。
5.5.5 復合類型
前面我們所說到的都是屬於簡單類型,即元素里面只有內容,不再包括屬性或者其它元素。接下來我們要讓元素里面包含屬性和其它元素,稱之為復合類型。

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsd:schema xmlns="http://www.test.cn" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <xsd:element name="internationPrice"> 5 <xsd:complexType> 6 <xsd:simpleContent> 7 <xsd:extension base="xsd:decimal"> 8 <xsd:attribute name="currency" type="xsd:string"/> 9 </xsd:extension> 10 </xsd:simpleContent> 11 </xsd:complexType> 12 </xsd:element> 13 </schema>
我們用complexType表示這是一個復合類型(這里我們是用匿名類型定義的)。simpleContent表示這個元素下面不包括子元素,extension表示這個元素值是decimal的,attribute來設置它的一個屬性currency,類型為string.
<internationPrice currency="str">3.1415926</internationPrice><!-- 正確 –>
5.5.6混合內容
同樣,我們采用了匿名類型方式來定義一個元素salutation。我們注意到在complexType后面多了一個mixed="true",這表明這是一個混合類型:里面既有元素本身的內容,又有其它子元素。name元素就是salutation的子元素。

1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsd:schema xmlns="http://www.test.cn" 3 xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 4 <xsd:element name="salutation"> 5 <xsd:complexType mixed="true"> 6 <xsd:sequence> 7 <xsd:element name="name" type="xsd:string"/> 8 </xsd:sequence> 9 </xsd:complexType> 10 </xsd:element> 11 </schema>
sequence表示子元素出現的順序要和schema里面的順序一樣。

1 <!-- 正確 --><salutation>Dear Mr.<name>Robert Smith</name>.</salutation> 2 <!-- 錯誤 --><salutation>Dear Mr.</salutation>
參考資料:
1. 韓順平xml視頻教程
3. xml入門經典