XML Schema

XML Schema


XSD (XML Schema Definition)
W3C於2001年5月發佈的推薦標準,指出如何形式描述XML文檔的元素。XSD是許多 XML Schema 語言中的一支。XSD是首先分離於XML自己的schema語言,故獲取W3C的推薦地位。

像全部XML Schema 語言同樣,XSD用來描述一組規則──一個XML文件必須遵照這些規則,才能根據該schema‘合法(Valid)’。php

然而,與其餘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發佈的1.1標準採用了「XSD」做爲官方稱呼。app

歷史

在官方文檔的參考附錄裏,XSD標準認可受到[文件類型描述|DTD]]和其餘早期XML schema 語言的影響,如DDMLSOXXML-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] 。ide

著名的XSD建議的內容但在XML本身的DTD中不可用的特性是名字空間感知(namespace awareness)與數據類型。spa

2012年4月, XSD 1.1成爲W3C推薦標準。April 2012設計

Schema與schema文檔

技術上說schema是元數據的一個抽象集合,包含一套schema component: 主要是元素與屬性的聲明、複雜與簡單數據類型的定義。這些schema component一般是在處理一批schema document時被建立。schema文檔包含着schema component的源語言定義。在平常使用中,一個schema文檔常被稱做一個schema。rest

Schema文檔經過名字空間組織起來:全部的被命名的schema component屬於一個目標名字空間;這個目標名字空間是schema文檔做爲總體的一個屬性。schema文檔能夠包含進來(include)使用同一名字空間的其它schema文檔,也能夠導入(import)使用不一樣名字空間的schema文檔。code

當一個實例文檔針對一個schema來驗證有效性時(這一過程稱爲assessment),用來驗證有效性的schema能夠做爲參數提供給驗證器,也能夠在實例文檔中做爲兩種特殊屬性之一直接提供:component

  • xsi:schemaLocation
  • xsi: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個基本數據類型:

  • 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 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>
相關文章
相關標籤/搜索