MA簡介
(一) Schema的引入
通過上幾章介紹,相信大家對XML的基本語法已經有了一個基本了解。 XML本身的語法很嚴謹,也就是要求格式必須嚴整,包
括區分大小寫、整個文檔有且只有一個根、需要序言等等。在符合格式化良好的要求以後,就可以寫出規則整齊、可以通過內置XML解
析器的浏覽器解析XML文檔了。但XML本身也相當的靈活,在符合基本語法的前提下,可以任意的編寫各種符合XML語法要求的文檔,這
也正是XML可擴展的靈活性所在,但同時也產生了問題,比如要寫一個說明個人信息的XML文檔,可以這樣寫:
<?XML version = “1.0” encoding=”GB2312” ?>
<resume>
<name>張立東</name>
<sex>男</sex>
<age>28</age>
<birthday>1974-8-10</birthday>
<address>北京市 海澱區</address>
</resume>
也可以這麼寫:
<?XML version = “1.0” encoding=”GB2312”?>
<resume>
<name>張立東</name>
<sex>男</sex>
<age>28</age>
<birthday>
<year>1974</year>
<month>8</month>
<day>10</day>
</birthday>
<address>北京市 海澱區</address>
</resume>
上面的兩個文檔對於人來說是很容易看懂的,但對於機器來說,它們就無法判斷
<birthday>1974-8-10</birthday>和
<birthday>
<year>1974</year>
<month>8</month>
<day>10</day>
</birthday>
中的內容是否相同了。這就需要一個相應的“約束”,來規定一個固定的格式,這樣機器才可以正確的識別、比較和處理。正如
沒有規矩難以成方圓一樣, XML這麼強大的語言自然也有這方面的考慮,這也就是DTD和Schema所要完成的功能。
(二)DTD和Schema
提到Schema就必須提到DTD。最早建立對SGML約束的是DTD,而XML又是SGML的超集,所以DTD由於歷史的原因也可以對XML本身
進行約束,比如:每個節點可以含有的元素、元素的個數等等。但它也有很多的局限性,如不能定義元素值的范圍、學習起來有一定
的難度(要學習一種新的語法)等等。而最新的XML約束標准就可以輕松的滿足要求,這就是Schema。Schema與DTD不同,DTD本身有自
己的語法和要求,而Schema是完全符合XML語法的,只要對XML有初步的了解,就很容易對Schema上手。說了這麼多,還是首先讓我們
通過一個例子來看看Schema是如何定義XML結構的吧:
[1]<?XML version="1.0" encoding="GB2312" ?>
[2]<Schema xmlns="urn:schemas-microsoft-com:XML-data"
[3] XMLns:dt="urn:schemas-microsoft-com:datatypes">
[4] <ElementType name= "name"/>
[5] <ElementType name= "sex"/>
[6] <ElementType name= "age"/>
[7]
[8] <ElementType name= "address" />
[9] <ElementType name= "month"/>
[10] <ElementType name= "year"/>
[11] <ElementType name= "day"/>
[12] <ElementType name= "birthday" content="eltOnly">
[13] <element type= "year" />
[14] <element type= "month" />
[15] <element type= "day" />
[16] </ElementType>
[17] <ElementType name= "resume" content="eltOnly">
[18] <element type= "name" />
[19] <element type="sex"/>
[20] <element type="age"/>
[21] <element type="birthday"/>
[22] <element type="address"/>
[23] </ElementType>
[24]</Schema>
下面對上面的例子做一個簡單的講解:
[1]行是一個XML序言,從這行也可以看出Schema是符合XML基本語法要求的。
[2]-[3]是對Schema名域的一個定義。(由於我們這裡是一個XML的入門文章,有關XML的名域問題可以參考相應的XML文檔。)
[4]定義一個名字為name的元素。
[5]-[11]分別是對sex、age、address、month、year、day元素的定義。
[12]-[16]是對birthday元素的一個定義,但birthday這個元素比較特殊,它其中又包含了year、month和day三個元素。
其中content這個屬性是對元素中的數據進行說明的。根據content中的數據eltOnly可以知道這個birthday元素的數據只能夠由元素構
成。
[17]-[23]是對resume這個元素的定義,resume這個元素是由name、sex、age、birthday、address這幾個元素構成的。
從上面的例子可以知道如何對一個簡單的元素進行定義,也可以知道一個由其他元素組成的元素如何定義。通過由元素組成的元
素的這種定義,就可以定義一個嵌套結構的XML樹的基本結構。
到這裡讀者對Schema已經就有了一個基本的了解,也該是我們給Schame下一個簡單定義的時候了:
XML Schema是用來描述XML元素和屬性的。它包括屬性和元素類型說明,是可以為XML元素和屬性提供數據的類型校驗模塊。