XML Schema
XSD (XML Schema Definition)是W3C于2001年5月發布的推薦標準,指出如何形式描述XML檔案的元素,XSD是許多XML Schema 語言中的一支,XSD是首先分離于XML本身的schema語言,故獲取W3C的推薦地位,
像所有XML Schema 語言一樣,XSD用來描述一組規則──一個XML檔案必須遵守這些規則,才能根據該schema‘合法(Valid)’,
然而,與其他XML Schema 語言不同,XSD意圖設計為在確認一個檔案的有效性時,將會產生滿足特定資料型別的一個資訊集合,這種后驗證的XML資訊集可用來開發XML檔案處理軟體,
目錄
- 1XSD名稱的來源
- 2歷史
- 3Schema與schema檔案
- 4Schema component
- 5資料型別
- 6Schema 既驗資訊集(Post-Schema-Validation Infoset)
- 7XML Schema的次要用途
- 7.1代碼生成
- 7.2XML檔案結構檔案的生成
- 8批評
- 9示范
- 10參見
- 11外部鏈接
XSD名稱的來源
因為有其他XML schema 語言存在,故在參考這W3C建議的語言時,使用XML Schema或W3C XML Schema,Schema永遠前綴大寫,
“XML Schema”在2001年5月成為W3C推薦標準,由于“XML Schema”作為一種W3C的推薦標準的名字與廣義的XML Schema 語言存在名稱上的混淆,用戶社區的一部分人采用了“WXS”來稱呼它, 用戶社區的另一部分人采用“XSD”(XML Schema Definition首字母縮略字)來稱呼它,W3C發布的1.1標準采用了“XSD”作為官方稱呼,
歷史
在官方檔案的參考附錄里,XSD標準承認受到[檔案型別描述|DTD]]和其他早期XML schema 語言的影響,如DDML、SOX、XML-Data、以及XDR,XSD從中吸收了一些特性,然而也在這些特性中有所折衷,這些早期schema 語言中的XDR與SOX在XML Schema發布后仍繼續使用了一段時間,不少微軟的產品支持XDR直到2006年十二月MSXML 6.0的發布(MSXML 6.0拋棄了XDR改用XSD)[1] ,Commerce One, Inc支持它自己的SOX schema 語言直到該公司于2004年末破產,2004年十二月,Novell, Inc.購買了該公司,包括那些與SOX相關的專利,據報導是盡力防止被某些不相關的、以打專利相關官司為生的公司剝削圖利[2] ,
著名的XSD建議的內容但在XML自己的DTD中不可用的特性是名字空間感知(namespace awareness)與資料型別,
2012年4月, XSD 1.1成為W3C推薦標準,April 2012
Schema與schema檔案
技術上說schema是元資料的一個抽象集合,包含一套schema component: 主要是元素與屬性的宣告、復雜與簡單資料型別的定義,這些schema component通常是在處理一批schema document時被創建,schema檔案包含著schema component的源語言定義,在日常使用中,一個schema檔案常被稱作一個schema,
Schema檔案通過名字空間組織起來:所有的被命名的schema component屬于一個目標名字空間;這個目標名字空間是schema檔案作為整體的一個屬性,schema檔案可以包含進來(include)使用同一名字空間的其它schema檔案,也可以匯入(import)使用不同名字空間的schema檔案,
當一個實體檔案針對一個schema來驗證有效性時(這一程序稱為assessment),用來驗證有效性的schema可以作為引數提供給驗證器,也可以在實體檔案中作為兩種特殊屬性之一直接提供:
xsi:schemaLocationxsi:noNamespaceSchemaLocation.這種機制要求客戶啟動驗證以充分相信這個檔案,知道檔案對正確的schema是有效的,
"xsi"是名字空間"http://www.w3.org/2001/XMLSchema-instance"的傳統前綴,
XML Schema Documents通常有檔案擴展名".xsd". XSD還沒有專門的互聯網媒體型別,因此按照 RFC 3023使用"application/xml"或"text/xml" .
Schema component
主要的schema component有:
- 元素宣告(Element declaration), 定義了元素的性質,包括:元素名字、目標名字空間;一個非常重要的性質是元素的型別,它限制了元素包含哪些屬性與子元素,在XSD 1.1標準中,可以根據屬性的值來有條件定義元素型別,一個元素可以屬于一個替換群(substitution group),如果元素E在元素H的替換群中,那么schema許可H出現的地方E都可以出現,元素可以有完整性(integrity)約束:唯一性(uniqueness)約束確定特定值在該元素為根的子樹中是獨一無二的;參考(referential)約束確定值必須匹配一些其它元素的識別符號,元素宣告可以是全域的或區域的,允許同一個名字被用于一個實體檔案的不同部分的不相關的元素,
- 屬性宣告(Attribute declaration),定義了屬性的性質,包括:屬性名字、目標名字空間,屬性型別限制了屬性可以取哪些值,也可以指出屬性的預設值或固定值(fixed value,即屬性只能取這個值),
- 簡單與復雜資料型別(Simple and complex type).詳見下節
- 模型群(model group)與屬性群(attribute group)定義,這實際上是宏(macro):被命名的元素的群與屬性的群,可在許多資料型別定義中被重用,
- 屬性使用(attribute use)表示復雜資料型別與屬性宣告的關系,指出屬性是必需的還是可選的,在什么時候使用這種資料型別,
- 元素粒子(element particle)類似于表示復雜型別與元素的關系,指出元素在背景關系中出現的最大與最小次數,類似于元素粒子,內容模型可以包括模型群粒子,在語法上相當于非終結符:定義了允許的元素序列的選擇與重復的單位,此外,通配符粒子表示了一套元素或元素序列,
其它更專門的schema component包括annotations, assertions, notations, 以及包含了schema整體資訊的schema component.
資料型別
簡單資料型別(simple type)包含了可以出現在元素或屬性的文本值,這是XSD與DTD的最大區別,
XSD提供了一套19個基本資料型別:
anyURIbase64BinarybooleandatedateTimedecimaldoubledurationfloathexBinarygDaygMonthgMonthDaygYeargYearMonthNOTATIONQNamestringtime).
可以從這些基本資料型別通過三種機制構建三種資料型別:
- restriction (減少值集的范圍),
- list (允許一個值的序列),
- union (允許從幾個資料型別中選擇值).
XSD規范定義了25個匯出資料型別,用戶可以在schema中進一步定義自己的匯出型別,
Restriction機制包括指出最大最小值、正則運算式、限制字串的長度、限制十進制數的位數等,XSD 1.1又增加了assertions, 即通過一個[XPath 2.0]]運算式給出任意約束的能力,
復雜資料型別描述了一個元素的許可內容,包括這個元素、屬性、子元素的許可內容,復雜型別定義由一套屬性使用與一個內容模型組成,內容模型可以是:
- 只有元素的內容(element-only content), 不允許有文本(但可以有空白符或者子元素可以有文本);
- 簡單內容(simple content), 允許有文本,不允許有子元素;
- 空內容(empty content), 文本與子元素都不被允許;
- 混合內容(mixed content), 文本與子元素都可以有.
復雜資料型別可以從別的復雜型別匯出:
- restriction方法,不允許基型別允許的一些元素、屬性或者值
- extension方法,允許額外的屬性或元素出現,
XSD 1.1又增加了assertion方法來約束復雜型別, 即通過一個[XPath 2.0]]運算式必須求值為真
Schema 既驗資訊集(Post-Schema-Validation Infoset)
基于 Schema 的驗證完成后,可以按照 Schema 所隱含的資料模型來表達檔案的結構與內容,XML Schema 資料模型包括:
- 詞匯(元素與屬性名稱集)
- 內容模型(關聯與結構)
- 資料型別
這些資訊的集合即為 Schema 既驗資訊集(Post-Schema-Validation Infoset (PSVI)),對于有效的 XML,PSVI 給它賦以特定的“型別”,從而便于以物件方式來處理整個檔案,并應用面向物件程式設計(OOP)范式,
XML Schema的次要用途
XML Schema的主要用途是形式描述XML檔案,然而最終的schema除了簡單驗證檔案外還有許多其他用途,
代碼生成
Schema可用于生成代碼,這稱作{[tsl|en|XML Data Binding}},這些代碼允許XML檔案的內容作為編程環境中的物件,
XML檔案結構檔案的生成
Schema可用于產生人可讀的檔案來描述一個XML檔案的結構,這在作者利用了標記元素(annotation element)時非常有用,
批評
雖然XML Schema獲取了廣泛的成功應用,但也受到了大量嚴厲的批評,遠超出其他W3C推薦標準,下述研究者很好地總結了這些批評:James Clark,[1] Anders M?ller與Michael Schwartzbach,[2] Rick Jelliffe[3],David Webber.[4]
一般問題:
- 推薦標準數百頁,陳述句非常技識訓,對于非專業的用戶來說過于復雜難讀,很多人發現W3Cs XML Schema Primer更易于理解.
- XSD缺少形式化數學規范,這使得關于schema的自動推理很困難,例如證明一個修改過的schema是向后兼容的,
- 語言中有很多例外,如元素的限制(restriction)不同于屬性的限制,
表達能力的實踐限制:
- XSD對無序內容提供了極少支持
- XSD不能要求提供root element (因而要求額外的資訊來驗證即使最簡單的檔案).
- 在描述mixed content, 沒有任何方式約束字符內容(甚至沒辦法指定一個有效字符集).
- 內容與屬性宣告不能依賴于元素或屬性背景關系 (這也是DTD的一個大問題).
- 不是100%自描述 (上一點就是個例子), 即使有這樣的初始設計需求.
- 默認不能被獨立于宣告被指定(這使其不能給出一族schema盡在默認值上不同);元素默認只能是字符資料(不包含markup).
技術問題:
- 雖然從技術上遵從名字空間,但看起來并不追隨名字空間的精神原則,(例如 "unqualified locals").
- XSD 1.0不提供機制,使得一個屬性的值或者存在依賴于另一個屬性的值或存在(被稱為co-occurrence constraints). XSD 1.1解決了這個問題.
- XSD資料型別的范圍非常隨意.[5]
- 驗證與擴增(augmentation,增加型別資訊與默認值)應該保持分離,
示范
一個Schema的簡易示例,描述某個指定的國家,是這樣的:
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="country" type="Country">
<xs:complexType name="Country">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="population" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
一份遵從這個視圖的XML檔案:
<country xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="country.xsd"> <name>France</name> <population>59.7</population> </country>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/120032.html
標籤:Html/Css
上一篇:HTML連載40-盒子寬度和高度的練習、box-sizing屬性
下一篇:CSS定位與布局
