1、XML的合法性驗證 應用XML技術的一個主要目標是為了方便信息交換。很顯然,只有XML文檔的格式或是結構得到交互各方的一致認可,這個目標才有可能實現。XML Schema(大綱)和DTD就是描述信息結構的模型,可以用來對XML文檔內容的合法性進行驗證。 Schema和DTD規定了在文檔中能夠使用的元素和屬性,以及這些對象與文本內容的可能組合形式。作為對文檔驗證的標准,Schema和DTD不僅應該能被人們理解,對應用程序來說也應當是易於理解的。對文檔合法性的驗證包括兩個方面:一方面是語法結構的驗證,即元素類型、元素嵌套格式、屬性類型、屬性值數據類型、屬性值是否可選等相關文檔對象單元本身及其結構的合法性;另一方面是語義的驗證,只有真正理解了XML文檔的含義才能算是實現了信息交互,否則僅是結構上正確但意義模糊的信息,對於接收方來說一樣是無用的,有時甚至會產生誤解,起到相反的作用。 對XML文檔的驗證有如下幾個步驟: 1.定義一份XML Schema或DTD: Schema或DTD為同一類型的所有文檔定義了結構標准,比如有關書籍信息的文檔可共享一份標准。 2.應用Schema或DTD:一般由文檔的作者指定Schema,這樣接收方可以很快地根據說明對文檔進行驗證。但在C/S(客戶機/服務器)環境中,由於服務器無法判斷XML在客戶端是否已經驗證過,所以為了能夠確保驗證過程,也為了避免可能的重復驗證,對文檔應用Schema或DTD的操作由服務器完成。 3.運行解析器進行驗證:解析器在裝載文檔的同時掃描結構,遇到任何錯誤都會終止裝載過程,並做出適當的響應。
2、Schema和DTD的區別 雖然,XML Schema和DTD都是用於文檔驗證,但二者還是有一定的區別,其中前者更為精確和靈活: ● XML Schema是一種內容“開放”的模型,可擴展、功能強,而DTD是內容“封閉”的模型,可擴展性差; ● XML Schema支持豐富的數據類型,完全能夠滿足網絡應用特別是電子商務的需求,而DTD不支持元素的數據類型,對於屬性的類型定義也很有限; ● XML Schema支持名稱空間機制,DTD不支持; ● XML Schema可以針對不同情況分別對整個XML文檔或者是文檔局部進行驗證,而DTD缺乏這種靈活性; ● XML Schema的語法完全遵循XML規范,可以和DOM技術結合使用,功能強大,而DTD語法自成一體,比較難以學習。 所以,Schema很有可能取代DTD成為驗證XML文檔合法性的新標准。
3、Schema的基本元素 Schema共有8種元素:<Schema>、<ElementType>、<element>、<group>、<AttributeType>、<attribute>、<datatype>和<description>。這些元素對XML中允許的語法和結構進行了定義。注意:必須在使用Schema前對這些元素進行定義。 1.<Schema>元素 Schema文件與其他的XML文檔結構非常相似,根元素為<Schema>,表明文檔類型: <?xml version=“1.0”?> <Schema name=“mySchema” xmlns=“urn:schemas-microsoft-com:xml-data” xmlns:dt=“urn:schemas-microsoft-com:datatypes”> </Schema> 其中屬性name指定Schema名稱,xmlns指定所屬名稱空間。第一個xmlns指定全文的缺省名稱空間,第二個定義了文檔中可使用的數據類型的名稱空間。 在XML中引用Schema的方法是在XML文檔的根元素中使用名稱空間指明Schema文件的URL地址,在URL前要加上“x-schema”前綴: <?xml version=“1.0”?> <myElement xmlns=“x-schema:http://mysite.com/myschema.xml”> </myElement> 如果是在XML文檔中的某一個元素中使用xmlns引用Schema,就是對文檔進行局部合法性驗證。 2.<ElementType>元素 <ElementType>元素用來聲明XML文檔中使用的新元素: <ElementType name = “element tag name” content = “empty”|“textOnly”|“eltOnly”|“mixed” model = “open” | “closed” order = “one” | “seq” | “many” dt:type = “XML data type” > </ElementType> Content屬性規定聲明的元素是否為空,是否包含文本或子元素,還是兩者都有;order指定子元素的排列順序; model規定了元素中是否可以包含未在Schema中定義的元素或屬性; dt: type則指定了元素的數據類型。 3.<element>元素 <element>元素是對<ElementType>聲明的元素的內容進行定義,說明在指定的元素類型中允許使用哪些子元素: <element type = “declared element type” minOccurs = “0” | “1” maxOccurs = “1” | “*” /> Type屬性是必要的,同時要與〈ElementType〉中的name屬性完全一致。minOccurs和maxOccurs屬性分別指定了元素出現的最少和最多次數,默認值都為1。minOccurs為0說明元素是可選的,maxOccurs為*說明元素出現的次數不受限制。 4.<group>元素 <group>元素也出現在<ElementType>中,表達元素成組的概念。組裡的對象可以是元素也可以是另一個子組。order屬性制定組中元素的順序: <ElementType name=“...” > <group minOccurs = “0” | “1” maxOccurs = “1” | “*” order = “one” | “seq” | “many” > <element type=“……” /> </group> </ElementType> 5.<AttributeType>元素 <AttributeType>元素定義了Schema中使用的屬性類型。根據出現位置不同,其作用范圍也不一樣。如果是在<ElementType>元素中定義,那麼所定義的屬性類型就只能作用在該元素類型上; 如果定義在外部,那麼文檔中所有的元素類型就都可以使用該屬性。 <AttributeType name = “attribute name” dt:type = “XML data type” required = “yes” | “no” dt:values = “enumerated list of values” default = “default value” > </AttributeType> Name是屬性類型名稱; dt:type同<ElementType>元素中的用法一樣 ;required指定該屬性對於引用它的元素是否是必要的;dt:values只有當dt:type是“enumeration”時才有效,此時它列舉屬性的所有可能取值; default指定屬性類型的缺省值,並且一定是有效值,比如屬性類型是枚舉型時,default取值一定是dt:values所列舉值中的一個。 6.<attribute>元素 <attribute>元素對<AttributeType>聲明的屬性進行具體的定義: <attribute type = “declared attribute type” required = “yes” | “no” default = “default value” /> type屬性唯一指定了引用的屬性類型,取值要與<AttributeType>中的name屬性完全一致; required說明該屬性對於引用它的元素是否為必要的; default指定屬性類型的缺省值。如果對同一屬性的<AttributeType>和<attribute>中相對應的default和required屬性都給出了定義,那麼<attribute>的優先級別更高,以它的取值為准。 其他兩個元素<datatype>和<description>分別定義了Schema元素的數據類型和為元素提供的說明資料,用法簡單,本文不再一一舉例說明。