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 檔案處理軟體。 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 釋出的 11 標準採用了 XSD 作為官方稱呼。 歷史 在官方文件的參考附錄裡，XSD 標準承認受到 DTD 和其他早期 XML schema 語言的影響，如、、、以及。XSD 從中吸收了一些特性，然而也在這些特性中有所折衷。這些早期 schema 語言中的 XDR 與 SOX 在 XML Schema 發布後仍繼續使用了一段時間。不少微軟的產品支援 XDR 直到 2006 年十二月 MSXML 60 的釋出（MSXML 60 拋棄了 XDR 改用 XSD） 。支援它自己的 SOX schema 語言直到該公司於 2004 年末破產。2004 年十二月，Novell Inc 購買了該公司，包括那些與 SOX 相關的專利，據報導是盡力防止被某些不相關的、以打專利相關官司為生的公司剝削圖利 。 著名的 XSD 建議的內容但在 XML 自己的 DTD 中不可用的特性是名稱空間感知（namespace awareness）與資料型別。 2012 年 4 月， XSD 11 成為 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 可以作為引數提供給驗證器，也可以在例項文件中作為兩種特殊屬性之一直接提供： xsischemaLocation xsinoNamespaceSchemaLocation 這種機制要求客戶啟動驗證以充分相信這個文件，知道文件對正確的 schema 是有效的。 xsi 是名稱空間 httpwwww3org2001XMLSchemainstance 的傳統字首。 XML Schema Documents 通常有副檔名 xsd XSD 還沒有專門的網際網路媒體型別，因此按照 RFC 3023 使用 applicationxml 或 textxml Schema component 主要的 schema component 有 元素宣告（Element declaration） 定義了元素的性質。包括：元素名字、目標名稱空間；一個非常重要的性質是元素的型別，它限制了元素包含哪些屬性與子元素。在 XSD 11 標準中，可以根據屬性的值來有條件定義元素型別。一個元素可以屬於一個替換群（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 個基本資料型別： anyURI base64Binary boolean date dateTime decimal double duration float hexBinary gDay gMonth gMonthDay gYear gYearMonth NOTATION QName string time 可以從這些基本資料型別透過三種機制構建三種資料型別： restriction 減少值集的範圍 list 允許一個值的序列 union 允許從幾個資料型別中選擇值 XSD 規範定義了 25 個匯出資料型別。使用者可以在 schema 中進一步定義自己的匯出型別。 Restriction 機制包括指出最大最小值、正則表示式、限制字串的長度、限制十進位制數的位數等。XSD 11 又增加了 assertions 即透過一個 XPath 20 表示式給出任意約束的能力。 複雜資料型別描述了一個元素的許可內容。包括這個元素、屬性、子元素的許可內容。複雜型別定義由一套屬性使用與一個內容模型組成。內容模型可以是： 只有元素的內容（elementonly content） 不允許有文字（但可以有空白符或者子元素可以有文字） 簡單內容（simple content） 允許有文字，不允許有子元素； 空內容（empty content） 文字與子元素都不被允許； 混合內容（mixed content） 文字與子元素都可以有 複雜資料型別可以從別的複雜型別匯出： restriction 方法，不允許基型別允許的一些元素、屬性或者值 extension 方法，允許額外的屬性或元素出現。 XSD 11 又增加了 assertion 方法來約束複雜型別，即透過一個 XPath 20 表示式必須求值為真 Schema 既驗資訊集（PostSchemaValidation Infoset） 基於 Schema 的驗證完成後，可以按照 Schema 所隱含的資料模型來表達文件的結構與內容。XML Schema 資料模型包括： 詞彙（元素與屬性名稱集） 內容模型（關聯與結構） 資料型別 這些資訊的集合即為 Schema 既驗資訊集（PostSchemaValidation Infoset （PSVI））。對於有效的 XML，PSVI 給它賦以特定的 型別，從而便於以物件方式來處理整個文件，並應用面向物件程式設計（OOP）正規化。 XML Schema 的次要用途 XML Schema 的主要用途是形式描述 XML 文件，然而最終的 schema 除了簡單驗證文件外還有許多其他用途。 程式碼生成 Schema 可用於生成程式碼，這稱作。這些程式碼允許 XML 文件的內容作為程式設計環境中的物件。 XML 檔案結構文件的生成 Schema 可用於產生人可讀的文件來描述一個 XML 檔案的結構。這在作者利用了標記元素（annotation element）時非常有用。 批評 雖然 XML Schema 取得了廣泛的成功應用，但也受到了大量嚴厲的批評，遠超出其他 W3C 推薦標準。下述研究者很好地總結了這些批評：James ClarkJames Clark summary of XML Schema criticisms and promotion of RELAX NG as an alternative httpswebarchiveorgweb20150316212413httpwwwimcorgietfxmlusemailarchivemsg00217html Anders Møller 與 Michael SchwartzbachAnders Møller and Michael I Schwartzbach presents Problems with XML Schema httpcsaudkamoellerXMLschemasxmlschemaproblemshtml Rick JelliffeRick Jelliffe critique in May 2009 httpbroadcastoreillycom200905w3cpleaseputxsd11onholdhtml ，David WebberDavid Webber OASIS comparison and insights white paper from August 2008 httpwwwoasisopenorgcommitteesdownloadphp29164White20Paper20on20CAM20and20XSDpdf 一般問題 推薦標準數百頁，語句非常技術化，對於非專業的使用者來說過於複雜難讀。很多人發現 W3Cs XML Schema Primer 更易於理解 XSD 缺少形式化數學規範，這使得關於 schema 的自動推理很困難，例如證明一個修改過的 schema 是向後相容的。 語言中有很多例外，如元素的限制（restriction）不同於屬性的限制。 表達能力的實踐限制 XSD 對無序內容提供了極少支援 XSD 不能要求提供 root element 因而要求額外的資訊來驗證即使最簡單的文件 在描述 mixed content 沒有任何方式約束字元內容 甚至沒辦法指定一個有效字元集 內容與屬性宣告不能依賴於元素或屬性上下文 這也是 DTD 的一個大問題 不是 100 自描述 上一點就是個例子 即使有這樣的初始設計需求 預設不能被獨立於宣告被指定 這使其不能給出一族 schema 盡在預設值上不同 元素預設只能是字元資料 不包含 markup 技術問題 雖然從技術上遵從名稱空間，但看起來並不追隨名稱空間的精神原則。例如 unqualified locals XSD 10 不提供機制，使得一個屬性的值或者存在依賴於另一個屬性的值或存在 被稱為 cooccurrence constraints XSD 11 解決了這個問題 XSD 資料型別的範圍非常隨意This point is amplified by Uche Ogbuji More on XML class warfare OReilly ONLamp Blog 驗證與擴增 augmentation，增加型別資訊與預設值 應該保持分離。 示範 一個 Schema 的簡易示例，描述某個指定的國家，是這樣的： xsschema xmlnsxshttpwwww3org2001XMLSchema xselement namecountry typeCountry xscomplexType nameCountry xssequence xselement namename typexsstring xselement namepopulation typexsdecimal xssequence xscomplexType xselement xsschema 一份遵從這個檢視的 XML 檔案： country xmlnsxsihttpwwww3org2001XMLSchemainstance xsinoNamespaceSchemaLocationcountryxsd nameFrancename population597population country 參見 RELAX NG 另一種 XML 綱要語言（ISO 國際標準）通常用在 XML Schema 資料型別上 XML 資訊集 參考文獻 外部連結 W3C 香港辦事處的權威翻譯 XML 及 SGML 名詞英漢翻譯表（臺灣） W3C XML Schema 規格：入門 ，結構 ，資料集 ，and 其他 W3Schools XML Schema 教學 W3School XML Schema 教學 CategoryW3C 標準 CategoryXML