XML(eXtensible Markup Language)可擴展的標記語言。xml在web service編程中尤為重要。在網絡傳輸中可以作為傳輸數據的載體。xml作為元語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的元語言。 它非常適合網絡傳輸,提供統一的方法來描述和交換獨立於應用程序或供應商的結構化數據。可以實現異構語言、異構平台之間的交互。XML 文檔定義方式有:文檔類型定義(DTD)和XML Schema。DTD(Document Type Definition)定義了文檔的整體結構以及文檔的語法(下面會有相應的例子用於理解)應用廣泛並有豐富的工具支持。XML Schema的功能更強大,用於定義管理信息等更強大、更豐富的特征。XML能夠更細粒度地聲明內容,定義約束,方便跨越多種平台的更有意義的傳輸內容。它提供了一種描述結構數據的格式,簡化了網絡中數據交換和表示,使得代碼、數據和表示分離,並作為數據交換的標准格式,因此它常被稱為智能數據文檔。可以把DTD比作鐵鏟,而XML Schema就可以說是挖掘機,功能更強大。 XML雖然稱作標記語言,但與HTML(超文本標記語言)不同,它的格式更嚴格,標簽必須封閉,顯示與內容分離,XML描述的是文檔的內容與語義而不是文檔該如何顯示。HTML有固定的標簽,顯示跟內容是一起的,不能創建自己的標簽,而XML是可擴展的,內容與顯示分離,每個元素都成對出現,又開始就有結束,而且XML元素的嵌套關系要保持正確(嵌套中后開始的標記要先結束,先開始的標記要后結束),每一個XML文檔中只有一個根元素(Root Element),根元素包含了其他所有的元素。符合XML語法的XML文檔在未被DTD或XML Schema驗證時叫做良構(well form)的,如果良構的xml文檔被DTD或XML Schema驗證,這種xml文檔稱為有效(Valid)的。
下面以一個學生名冊的xml作為例子
1 <?xml version="1.0" encoding="utf-8"?> 2 <學生名冊> 3 <學生 學號="A1"> 4 <姓名>CIACs</姓名> 5 <性別>男</性別> 6 <年齡>22</年齡> 7 </學生> 8 9 <學生 學號="A2"> 10 <姓名>zhihao</姓名> 11 <性別>男</性別> 12 <年齡>23</年齡> 13 </學生> 14 </學生名冊>
格式良好的xml文檔,XMLSpy的輸出窗口會輸出如下結果
xml的首行一定要是<?xml version="1.0"?>處理指令,且”<?xml”之間不能有空白,xml元素嚴格區分大小寫,文檔編碼格式默認為“UTF-8”,版本只有1.0。上面的xml文檔只能說是格式良好的xml文檔,不能說是有效的(Vaild)xml文檔。下面我們用兩種方式去驗證它。
首先是通過DTD來對它進行驗證
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE 學生名冊 [ 3 <!ELEMENT 學生名冊 (學生+)> 4 <!ELEMENT 學生 (名字,性別,年齡)> 5 <!ELEMENT 名字 (#PCDATA)> 6 <!ELEMENT 性別 (#PCDATA)> 7 <!ELEMENT 年齡 (#PCDATA)> 8 <!ATTLIST 學生 學號 ID #REQUIRED> 9 <!ENTITY sex "男"> 10 ]> 11 12 <學生名冊> 13 <學生 學號="A1"> 14 <名字>CIACs</名字> 15 <性別>&sex;</性別> 16 <年齡>22</年齡> 17 </學生> 18 19 <學生 學號="A2"> 20 <名字>zhihao</名字> 21 <性別>&sex;</性別> 22 <年齡>23</年齡> 23 </學生> 24 </學生名冊>
如果驗證通過的話,XMLSpy輸出窗口會有如下的結果顯示
否則就算是多了一個空格都不會通過驗證。這里我把dtd的驗證寫到了xml中,當然你也可以把它寫到另一個文件中,該文件的后綴名為“.dtd”,然后把它關聯到要驗證的xml文檔中,語法如下
1 <!DOCTYPE 根元素名 SYSTEM "*.dtd">
此處ID值好像要以字符開頭,如果只是數字通不過驗證。
學生信息中的性別,我把它定義為實體,然后通過實體引用它的值,要注意實體引用的語法是"&實體名;"。
下面通過XML Schema方式來驗證
要驗證的xml文檔
1 <?xml version="1.0" encoding="utf-8"?> 2 <學生名冊 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="學生名冊.xsd"> 3 <學生 學號="A1"> 4 <姓名>CIACs</姓名> 5 <性別>男</性別> 6 <年齡>22</年齡> 7 </學生> 8 9 <學生 學號="A2"> 10 <姓名>zhihao</姓名> 11 <性別>男</性別> 12 <年齡>23</年齡> 13 </學生> 14 </學生名冊>
XML Schema驗證文檔
1 <?xml version="1.0" encoding="UTF-8"?> 2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 3 <xs:element name="學生名冊"> 4 <xs:complexType> 5 <xs:sequence minOccurs="1" maxOccurs="unbounded"> 6 <xs:element ref="學生"/> 7 </xs:sequence> 8 </xs:complexType> 9 </xs:element> 10 <xs:element name="學生"> 11 <xs:complexType> 12 <xs:sequence> 13 <xs:element name="姓名" type="xs:string"/> 14 <xs:element name="性別"> 15 <xs:simpleType> 16 <xs:restriction base="xs:string"> 17 <xs:enumeration value="男"/> 18 <xs:enumeration value="女"/> 19 </xs:restriction> 20 </xs:simpleType> 21 </xs:element> 22 <xs:element name="年齡"> 23 <xs:simpleType> 24 <xs:restriction base="xs:integer"> 25 <xs:minExclusive value="0"/> 26 <xs:maxExclusive value="120"/> 27 </xs:restriction> 28 </xs:simpleType> 29 </xs:element> 30 </xs:sequence> 31 <xs:attribute name="學號" type="xs:string" use="required"/> 32 </xs:complexType> 33 </xs:element> 34 </xs:schema>
XMLSpy輸出窗口的輸出結果
要驗證的xml的文檔通過在根元素開始標簽中加入下面的信息關聯XML Schema文檔
1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="學生名冊.xsd"
以上的文檔都是放在同一路徑下的,所以直接引用文件名就行了。
從上面的兩種驗證方式我們可以很清楚的看出DTD跟XML Schema驗證的區別,兩者同樣是進行xml文檔驗證的,XML Schema提供了比DTD更為強大的功能和更細粒度的數據類型,而且Schema還可以自定義數據類型,其本身就是xml文件,但dtd的語法跟xml的語法不同。雖然從代碼量來看Schema大於dtd,但是當你學過Schema后你就會更喜歡用Schema。
學好xml和它的驗證方式,對於后面學習web service編程很重要。