XML 學習筆記

Blog: https://blog.yilon.tophtml

XML 簡介

  • XML 指可擴展標記語言(EXtensible Markup Language)。
  • XML 是一種很像HTML的標記語言。
  • XML 的設計宗旨是傳輸數據,而不是顯示數據。
  • XML 標籤沒有被預約義。您須要自行定義標籤。
  • XML 被設計爲具備自我描述性。
  • XML 是 W3C 的推薦標準。
  • HTML 被設計用來顯示數據。

XML 是對 HTML 的補充。node

XML 不會替代 HTML,理解這一點很重要。在大多數 Web 應用程序中,XML 用於傳輸數據,而 HTML 用於格式化並顯示數據。git

對 XML 最好的描述是:數據庫

XML 是獨立於軟件和硬件的信息傳輸工具。瀏覽器

XML 用途

XML 應用於 Web 開發的許多方面,經常使用於簡化數據的存儲和共享。服務器

XML 把數據從 HTML 分離

若是您須要在 HTML 文檔中顯示動態數據,那麼每當數據改變時將花費大量的時間來編輯 HTML。網絡

經過 XML,數據可以存儲在獨立的 XML 文件中。這樣您就能夠專一於使用 HTML/CSS 進行顯示和佈局,並確保修改底層數據再也不須要對 HTML 進行任何的改變。dom

經過使用幾行 JavaScript 代碼,您就能夠讀取一個外部 XML 文件,並更新您的網頁的數據內容。編輯器


XML 簡化數據共享

在真實的世界中,計算機系統和數據使用不兼容的格式來存儲數據。ide

XML 數據以純文本格式進行存儲,所以提供了一種獨立於軟件和硬件的數據存儲方法。

這讓建立不一樣應用程序能夠共享的數據變得更加容易。


XML 簡化數據傳輸

對開發人員來講,其中一項最費時的挑戰一直是在互聯網上的不兼容系統之間交換數據。

因爲能夠經過各類不兼容的應用程序來讀取數據,以 XML 交換數據下降了這種複雜性。


XML 簡化平臺變動

升級到新的系統(硬件或軟件平臺),老是很是費時的。必須轉換大量的數據,不兼容的數據常常會丟失。

XML 數據以文本格式存儲。這使得 XML 在不損失數據的狀況下,更容易擴展或升級到新的操做系統、新的應用程序或新的瀏覽器。


XML 使您的數據更有用

不一樣的應用程序都可以訪問您的數據,不只僅在 HTML 頁中,也能夠從 XML 數據源中進行訪問。

經過 XML,您的數據可供各類閱讀設備使用(掌上計算機、語音設備、新聞閱讀器等),還能夠供盲人或其餘殘障人士使用。


XML 用於建立新的互聯網語言

不少新的互聯網語言是經過 XML 建立的。

這裏有一些實例:

  • XHTML
  • 用於描述可用的 Web 服務 的 WSDL
  • 做爲手持設備的標記語言的 WAP 和 WML
  • 用於新聞 feed 的 RSS 語言
  • 描述資本和本體的 RDF 和 OWL
  • 用於描述針針對 Web 的多媒體 的 SMIL

假如開發人員都是理性的

假如他們都是理性的,就讓將來的應用程序使用 XML 來交換數據吧。

將來也許會出現某種字處理軟件、電子表格程序以及數據庫,它們可使用 XML 格式讀取彼此的數據,而不須要使用任何的轉換程序。

XML 語法規則

全部 XML 元素都須有關閉標籤

在 HTML,常常會看到沒有關閉標籤的元素:

<p>This is a paragraph
<p>This is another paragraph

在 XML 中,省略關閉標籤是非法的。全部元素都必須有關閉標籤:

<p>This is a paragraph</p>
<p>This is another paragraph</p>

註釋:您也許已經注意到 XML 聲明沒有關閉標籤。這不是錯誤。聲明不屬於XML自己的組成部分。它不是 XML 元素,也不須要關閉標籤。

XML 標籤對大小寫敏感

XML 元素使用 XML 標籤進行定義。

XML 標籤對大小寫敏感。在 XML 中,標籤 與標籤 是不一樣的。

必須使用相同的大小寫來編寫打開標籤和關閉標籤:

<Message>這是錯誤的。</message>

<message>這是正確的。</message>

註釋:打開標籤和關閉標籤一般被稱爲開始標籤和結束標籤。不論您喜歡哪一種術語,它們的概念都是相同的。

XML 必須正確地嵌套

在 HTML 中,常會看到沒有正確嵌套的元素:

<b><i>This text is bold and italic</b></i>

在 XML 中,全部元素都必須彼此正確地嵌套:

<b><i>This text is bold and italic</i></b>

在上例中,正確嵌套的意思是:因爲 <i> 元素是在 <b> 元素內打開的,那麼它必須在 <b> 元素內關閉。

XML 文檔必須有根元素

XML 文檔必須有一個元素是全部其餘元素的父元素。該元素稱爲根元素

<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

XML 的屬性值須加引號

與 HTML 相似,XML 也可擁有屬性(名稱/值的對)。

在 XML 中,XML 的屬性值須加引號。請研究下面的兩個 XML 文檔。第一個是錯誤的,第二個是正確的:

<note date=08/08/2008>
<to>George</to>
<from>John</from>
</note> 
<note date="08/08/2008">
<to>George</to>
<from>John</from>
</note>

在第一個文檔中的錯誤是,note 元素中的 date 屬性沒有加引號。

實體引用

在 XML 中,一些字符擁有特殊的意義。

若是你把字符 "<" 放在 XML 元素中,會發生錯誤,這是由於解析器會把它看成新元素的開始。

這樣會產生 XML 錯誤:

<message>if salary < 1000 then</message>

爲了不這個錯誤,請用實體引用來代替 "<" 字符:

<message>if salary &lt; 1000 then</message>

在 XML 中,有 5 個預約義的實體引用:

< < 小於
> > 大於
& & 和號
' ' 單引號
" " 引號

註釋:在 XML 中,只有字符 "<" 和 "&" 確實是非法的。大於號是合法的,可是用實體引用來代替它是一個好習慣。

XML 中的註釋

在 XML 中編寫註釋的語法與 HTML 的語法很類似:

<!-- This is a comment -->

在 XML 中,空格會被保留

HTML 會把多個連續的空格字符裁減(合併)爲一個:

HTML:    Hello           my name is David.
輸出:    Hello my name is David.

在 XML 中,文檔中的空格不會被刪節。

XML 以 LF 存儲換行

在 Windows 應用程序中,換行一般以一對字符來存儲:回車符 (CR) 和換行符 (LF)。這對字符與打字機設置新行的動做有類似之處。在 Unix 應用程序中,新行以 LF 字符存儲。而 Macintosh 應用程序使用 CR 來存儲新行。

XML 元素

XML 文檔包含 XML 元素。

什麼是 XML 元素?

XML 元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分。

元素可包含其餘元素、文本或者二者的混合物。元素也能夠擁有屬性。

<bookstore>
<book category="CHILDREN">
  <title>Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title>Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>

在上例中, 都擁有 元素內容,由於它們包含了其餘元素。 只有 文本內容,由於它僅包含文本。

在上例中,只有 元素擁有 屬性 (category="CHILDREN")。

XML 命名規則

XML 元素必須遵循如下命名規則:

  • 名稱能夠含字母、數字以及其餘的字符
  • 名稱不能以數字或者標點符號開始
  • 名稱不能以字符 「xml」(或者 XML、Xml)開始
  • 名稱不能包含空格

可以使用任何名稱,沒有保留的字詞。

最佳命名習慣

使名稱具備描述性。使用下劃線的名稱也很不錯。

名稱應當比較簡短,好比:<book_title>,而不是:<the_title_of_the_book>。

避免 "-" 字符。若是您按照這樣的方式進行命名:"first-name",一些軟件會認爲你須要提取第一個單詞。

避免 "." 字符。若是您按照這樣的方式進行命名:"first.name",一些軟件會認爲 "name" 是對象 "first" 的屬性。

避免 ":" 字符。冒號會被轉換爲命名空間來使用(稍後介紹)。

XML 文檔常常有一個對應的數據庫,其中的字段會對應 XML 文檔中的元素。有一個實用的經驗,即便用數據庫的名稱規則來命名 XML 文檔中的元素。

非英語的字母好比 éòá 也是合法的 XML 元素名,不過須要留意當軟件開發商不支持這些字符時可能出現的問題。

XML 元素是可擴展的

XML 元素是可擴展,以攜帶更多的信息。

XML 屬性

XML 元素能夠在開始標籤中包含屬性,相似 HTML。

屬性 (Attribute) 提供關於元素的額外(附加)信息。

XML 屬性必須加引號

屬性值必須被引號包圍,不過單引號和雙引號都可使用。好比一我的的性別,person 標籤能夠這樣寫:

避免 XML 屬性?

因使用屬性而引發的一些問題:

  • 屬性沒法包含多重的值(元素能夠)
  • 屬性沒法描述樹結構(元素能夠)
  • 屬性不易擴展(爲將來的變化)
  • 屬性難以閱讀和維護

請儘可能使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。

不要作這樣的蠢事(這不是 XML 應該被使用的方式):

<note day="08" month="08" year="2008"
to="George" from="John" heading="Reminder" 
body="Don't forget the meeting!">
</note>

針對元數據的 XML 屬性

有時候會向元素分配 ID 引用。這些 ID 索引可用於標識 XML 元素,它起做用的方式與 HTML 中 ID 屬性是同樣的。這個例子向咱們演示了這種狀況:

<messages>
  <note id="501">
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
  </note>
  <note id="502">
    <to>John</to>
    <from>George</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note> 
</messages>

上面的 ID 僅僅是一個標識符,用於標識不一樣的便籤。它並非便籤數據的組成部分。

在此咱們極力向您傳遞的理念是:元數據(有關數據的數據)應當存儲爲屬性,而數據自己應當存儲爲元素。

XML 驗證

擁有正確語法的 XML 被稱爲「形式良好」的 XML。

經過 DTD 驗證的 XML 是「合法」的 XML。

形式良好的 XML 文檔

「形式良好」或「結構良好」的 XML 文檔擁有正確的語法。

「形式良好」(Well Formed)的 XML 文檔會遵照前幾章介紹過的 XML 語法規則:

  • XML 文檔必須有根元素
  • XML 文檔必須有關閉標籤
  • XML 標籤對大小寫敏感
  • XML 元素必須被正確的嵌套
  • XML 屬性必須加引號

XMLHttpRequest 對象

XMLHttpRequest 對象用於在後臺與服務器交換數據。

什麼是 XMLHttpRequest 對象?

XMLHttpRequest 對象用於在後臺與服務器交換數據。

XMLHttpRequest 對象是開發者的夢想,由於您可以:

  • 在不從新加載頁面的狀況下更新網頁
  • 在頁面已加載後從服務器請求數據
  • 在頁面已加載後從服務器接收數據
  • 在後臺向服務器發送數據

全部現代的瀏覽器都支持 XMLHttpRequest 對象。

XML DOM

DOM (Document Object Model,文檔對象模型)定義了訪問和操做文檔的標準方法。

XML DOM

XML DOM (XML Document Object Model) 定義了訪問和操做 XML 文檔的標準方法。

DOM 把 XML 文檔做爲樹結構來查看。可以經過 DOM 樹來訪問全部元素。能夠修改或刪除它們的內容,並建立新的元素。元素,它們的文本,以及它們的屬性,都被認爲是節點。

在下面的例子中,咱們使用 DOM 引用從 元素中獲取文本:

xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue
  • xmlDoc -由解析器建立的 XML 文檔
  • getElementsByTagName("to")[0] - 第一個 元素
  • childNodes[0] - 元素的第一個子元素(文本節點)
  • nodeValue - 節點的值(文本自己)

XML 命名空間(XML Namespaces)

命名衝突

在 XML 中,元素名稱是由開發者定義的,當兩個不一樣的文檔使用相同的元素名時,就會發生命名衝突。

此文檔帶有某個表格中的信息:

<h:table>
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

此 XML 文檔攜帶着有關一件傢俱的信息:

<f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

如今,命名衝突不存在了,這是因爲兩個文檔都使用了不一樣的名稱來命名它們的

經過使用前綴,咱們建立了兩種不一樣類型的

元素 (<h:table> 和 <f:table>)。

使用命名空間(Namespaces)

使用命名空間(Namespaces)

這個 XML 文檔攜帶着某個表格中的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

此 XML 文檔攜帶着有關一件傢俱的信息:

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

與僅僅使用前綴不一樣,咱們爲

元素。

放置於元素的開始標籤之中,並使用如下的語法:

xmlns:namespace-prefix="namespaceURI"

當命名空間被定義在元素的開始標籤中時,全部帶有相同前綴的子元素都會與同一個命名空間相關聯。

註釋:用於標示命名空間的地址不會被解析器用於查找信息。其唯一的做用是賦予命名空間一個唯一的名稱。不過,不少公司經常會做爲指針來使用命名空間指向實際存在的網頁,這個網頁包含關於命名空間的信息。

請訪問 http://www.w3.org/TR/html4/。

統一資源標識符(Uniform Resource Identifier (URI))

統一資源標識符是一串能夠標識因特網資源的字符。最經常使用的 URI 是用來標示因特網域名地址的統一資源定位器(URL)。另外一個不那麼經常使用的 URI 是統一資源命名(URN)。在咱們的例子中,咱們僅使用 URL。

默認的命名空間(Default Namespaces)

爲元素定義默認的命名空間可讓咱們省去在全部的子元素中使用前綴的工做。

請使用下面的語法:

xmlns="namespaceURI"

這個 XML 文檔攜帶着某個表格中的信息:

<table xmlns="http://www.w3.org/TR/html4/">
   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>
</table>

此 XML 文檔攜帶着有關一件傢俱的信息:

<table xmlns="http://www.w3school.com.cn/furniture">
   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
</table>

命名空間的實際應用

當開始使用 XSL 時,您不久就會看到實際使用中的命名空間。XSL 樣式表用於將 XML 文檔轉換爲其餘格式,好比 HTML。

若是您仔細觀察下面的這個 XSL 文檔,就會看到大多數的標籤是HTML標籤。非 HTML 的標籤都有前綴 xsl,並由此命名空間標示:"http://www.w3.org/1999/XSL/Transform":

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr>
      <th align="left">Title</th>
      <th align="left">Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

XML Schema 簡介

XML Schema 是基於 XML 的 DTD 替代者。

XML Schema 可描述 XML 文檔的結構。

XML Schema 語言也可做爲 XSD(XML Schema Definition)來引用。

什麼是 XML Schema?

XML Schema 的做用是定義 XML 文檔的合法構建模塊,相似 DTD。

XML Schema:

  • 定義可出如今文檔中的元素
  • 定義可出如今文檔中的屬性
  • 定義哪一個元素是子元素
  • 定義子元素的次序
  • 定義子元素的數目
  • 定義元素是否爲空,或者是否可包含文本
  • 定義元素和屬性的數據類型
  • 定義元素和屬性的默認值以及固定值

XML Schema 是 DTD 的繼任者

咱們認爲 XML Schema 很快會在大部分網絡應用程序中取代 DTD。

理由以下:

  • XML Schema 可針對將來的需求進行擴展
  • XML Schema 更完善,功能更強大
  • XML Schema 基於 XML 編寫
  • XML Schema 支持數據類型
  • XML Schema 支持命名空間

XML Schema 是 W3C 標準

XML Schema 在 2001 年 5 月 2 日成爲 W3C 標準。

XML Schema 支持數據類型

XML Schema 最重要的能力之一就是對數據類型的支持。

經過對數據類型的支持:

  • 可更容易地描述容許的文檔內容
  • 可更容易地驗證數據的正確性
  • 可更容易地與來自數據庫的數據一併工做
  • 可更容易地定義數據約束(data facets)
  • 可更容易地定義數據模型(或稱數據格式)
  • 可更容易地在不一樣的數據類型間轉換數據

編者注:數據約束,或稱 facets,是 XML Schema 原型中的一個術語,中文可譯爲「面」,用來約束數據類型的允許值。

XML Schema 使用 XML 語法

另外一個關於 XML Schema 的重要特性是,它們由 XML 編寫。

由 XML 編寫 XML Schema 有不少好處:

  • 沒必要學習新的語言
  • 可以使用 XML 編輯器來編輯 Schema 文件
  • 可以使用 XML 解析器來解析 Schema 文件
  • 可經過 XML DOM 來處理 Schema
  • 可經過 XSLT 來轉換 Schema

XML Schema 可保護數據通訊

當數據從發送方被髮送到接受方時,其要點是雙方應有關於內容的相同的「指望值」。

經過 XML Schema,發送方能夠用一種接受方可以明白的方式來描述數據。

一種數據,好比 "03-11-2004",在某些國家被解釋爲11月3日,而在另外一些國家爲看成3月11日。

可是一個帶有數據類型的 XML 元素,好比: 2004-03-11 ,可確保對內容一致的理解,這是由於 XML 的數據類型 "date" 要求的格式是 "YYYY-MM-DD"。

XML Schema 可擴展

XML Schema 是可擴展的,由於它們由 XML 編寫。

經過可擴展的 Schema 定義,您能夠:

  • 在其餘 Schema 中重複使用您的 Schema
  • 建立由標準類型衍生而來的您本身的數據類型
  • 在相同的文檔中引用多重的 Schema

形式良好是不夠的

咱們把符合 XML 語法的文檔稱爲形式良好的 XML 文檔,好比:

  • 它必須以 XML 聲明開頭
  • 它必須擁有惟一的根元素
  • 開始標籤必須與結束標籤相匹配
  • 元素對大小寫敏感
  • 全部的元素都必須關閉
  • 全部的元素都必須正確地嵌套
  • 必須對特殊字符使用實體

即便文檔的形式良好,仍然不能保證它們不會包含錯誤,而且這些錯誤可能會產生嚴重的後果。

請考慮下面的狀況:您訂購的了 5 打激光打印機,而不是 5 臺。經過 XML Schema,大部分這樣的錯誤會被您的驗證軟件捕獲到。

XSD - 元素

** 元素是每個 XML Schema 的根元素。**

<?xml version="1.0"?>
 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

...
...
</xs:schema>

代碼解釋:

下面的片段:

xmlns:xs="http://www.w3.org/2001/XMLSchema"

顯示 schema 中用到的元素和數據類型來自命名空間 "http://www.w3.org/2001/XMLSchema"。同時它還規定了來自命名空間 "http://www.w3.org/2001/XMLSchema" 的元素和數據類型應該使用前綴 xs:

這個片段:

targetNamespace="http://www.w3school.com.cn"

顯示被此 schema 定義的元素 (note, to, from, heading, body) 來自命名空間: "http://www.w3school.com.cn"。

這個片段:

xmlns="http://www.w3school.com.cn"

指出默認的命名空間是 "http://www.w3school.com.cn"。

這個片段:

elementFormDefault="qualified"

指出任何 XML 實例文檔所使用的且在此 schema 中聲明過的元素必須被命名空間限定。

在 XML 文檔中引用 Schema

此 XML 文檔含有對 XML Schema 的引用:

<?xml version="1.0"?>

<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">

<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>

代碼解釋:

下面的片段:

xmlns="http://www.w3school.com.cn"

規定了默認命名空間的聲明。此聲明會告知 schema 驗證器,在此 XML 文檔中使用的全部元素都被聲明於 "http://www.w3school.com.cn" 這個命名空間。

一旦您擁有了可用的 XML Schema 實例命名空間:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

您就可使用 schemaLocation 屬性了。此屬性有兩個值。第一個值是須要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置:

xsi:schemaLocation="http://www.w3school.com.cn note.xsd"

XSD 簡易元素

XML Schema 可定義 XML 文件的元素。

簡易元素指那些只包含文本的元素。它不會包含任何其餘的元素或屬性。

什麼是簡易元素?

簡易元素指那些僅包含文本的元素。它不會包含任何其餘的元素或屬性。

不過,「僅包含文本」這個限定卻很容易形成誤解。文本有不少類型。它能夠是 XML Schema 定義中包括的類型中的一種(布爾、字符串、數據等等),或者它也能夠是您自行定義的定製類型。

您也可向數據類型添加限定(即 facets),以此來限制它的內容,或者您能夠要求數據匹配某種特定的模式。

定義簡易元素

定義簡易元素的語法:

<xs:element name="xxx" type="yyy"/>

此處 xxx 指元素的名稱,yyy 指元素的數據類型。XML Schema 擁有不少內建的數據類型。

最經常使用的類型是:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

例子:

這是一些 XML 元素:

<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>

這是相應的簡易元素定義:

<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

簡易元素的默認值和固定值

簡易元素可擁有指定的默認值或固定值。

當沒有其餘的值被規定時,默認值就會自動分配給元素。

在下面的例子中,缺省值是 "red":

<xs:element name="color" type="xs:string" default="red"/>

固定值一樣會自動分配給元素,而且您沒法規定另一個值。

在下面的例子中,固定值是 "red":

<xs:element name="color" type="xs:string" fixed="red"/>

XSD 屬性

全部的屬性均做爲簡易類型來聲明。

什麼是屬性?

簡易元素沒法擁有屬性。假如某個元素擁有屬性,它就會被看成某種複合類型。可是屬性自己老是做爲簡易類型被聲明的。

如何聲明屬性?

定義屬性的語法是:

<xs:attribute name="xxx" type="yyy"/>

在此處,xxx 指屬性名稱,yyy 則規定屬性的數據類型。XML Schema 擁有不少內建的數據類型。

最經常使用的類型是:

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

實例

這是帶有屬性的 XML 元素:

<lastname lang="EN">Smith</lastname>

這是對應的屬性定義:

<xs:attribute name="lang" type="xs:string"/>

屬性的默認值和固定值

屬性可擁有指定的默認值或固定值。

當沒有其餘的值被規定時,默認值就會自動分配給元素。

在下面的例子中,缺省值是 "EN":

<xs:attribute name="lang" type="xs:string" default="EN"/>

固定值一樣會自動分配給元素,而且您沒法規定另外的值。

在下面的例子中,固定值是 "EN":

<xs:attribute name="lang" type="xs:string" fixed="EN"/>

可選的和必需的屬性

在缺省的狀況下,屬性是可選的。如需規定屬性爲必選,請使用 "use" 屬性:

<xs:attribute name="lang" type="xs:string" use="required"/>

對內容的限定

當 XML 元素或屬性擁有被定義的數據類型時,就會向元素或屬性的內容添加限定。

假如 XML 元素的類型是 "xs:date",而其包含的內容是相似 "Hello World" 的字符串,元素將不會(經過)驗證。

經過 XML schema,您也可向您的 XML 元素及屬性添加本身的限定。這些限定被稱爲 facet(編者注:意爲(多面體的)面,可譯爲限定面)。您會在下一節瞭解到更多有關 facet 的知識。

XSD 限定 / Facets

限定(restriction)用於爲 XML 元素或者屬性定義可接受的值。對 XML 元素的限定被稱爲 facet。

對值的限定

下面的例子定義了帶有一個限定且名爲 "age" 的元素。age 的值不能低於 0 或者高於 120:

<xs:element name="age">

<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:minInclusive value="0"/>
    <xs:maxInclusive value="120"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

對一組值的限定

如需把 XML 元素的內容限制爲一組可接受的值,咱們要使用枚舉約束(enumeration constraint)。

下面的例子定義了帶有一個限定的名爲 "car" 的元素。可接受的值只有:Audi, Golf, BMW:

<xs:element name="car">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

上面的例子也能夠被寫爲:

<xs:element name="car" type="carType"/>

<xs:simpleType name="carType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

註釋:在這種狀況下,類型 "carType" 可被其餘元素使用,由於它不是 "car" 元素的組成部分。

對一系列值的限定

如需把 XML 元素的內容限制定義爲一系列可以使用的數字或字母,咱們要使用模式約束(pattern constraint)。

下面的例子定義了帶有一個限定的名爲 "letter" 的元素。可接受的值只有小寫字母 a - z 其中的一個:

<xs:element name="letter">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-z]"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下一個例子定義了帶有一個限定的名爲 "initials" 的元素。可接受的值是大寫字母 A - Z 其中的三個:

<xs:element name="initials">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[A-Z][A-Z][A-Z]"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下一個例子也定義了帶有一個限定的名爲 "initials" 的元素。可接受的值是大寫或小寫字母 a - z 其中的三個:

<xs:element name="initials">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下一個例子定義了帶有一個限定的名爲 "choice 的元素。可接受的值是字母 x, y 或 z 中的一個:

<xs:element name="choice">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[xyz]"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下一個例子定義了帶有一個限定的名爲 "prodid" 的元素。可接受的值是五個阿拉伯數字的一個序列,且每一個數字的範圍是 0-9:

<xs:element name="prodid">

<xs:simpleType>
  <xs:restriction base="xs:integer">
    <xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

對一系列值的其餘限定

下面的例子定義了帶有一個限定的名爲 "letter" 的元素。可接受的值是 a - z 中零個或多個字母:

<xs:element name="letter">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="([a-z])*"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下面的例子定義了帶有一個限定的名爲 "letter" 的元素。可接受的值是一對或多對字母,每對字母由一個小寫字母后跟一個大寫字母組成。舉個例子,"sToP"將會經過這種模式的驗證,可是 "Stop"、"STOP" 或者 "stop" 沒法經過驗證:

<xs:element name="letter">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="([a-z][A-Z])+"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下面的例子定義了帶有一個限定的名爲 "gender" 的元素。可接受的值是 male 或者 female:

<xs:element name="gender">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="male|female"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

下面的例子定義了帶有一個限定的名爲 "password" 的元素。可接受的值是由 8 個字符組成的一行字符,這些字符必須是大寫或小寫字母 a - z 亦或數字 0 - 9:

<xs:element name="password">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:pattern value="[a-zA-Z0-9]{8}"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

對空白字符的限定

如需規定對空白字符(whitespace characters)的處理方式,咱們須要使用 whiteSpace 限定。

下面的例子定義了帶有一個限定的名爲 "address" 的元素。這個 whiteSpace 限定被設置爲 "preserve",這意味着 XML 處理器不會移除任何空白字符:

<xs:element name="address">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="preserve"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

這個例子也定義了帶有一個限定的名爲 "address" 的元素。這個 whiteSpace 限定被設置爲 "replace",這意味着 XML 處理器將移除全部空白字符(換行、回車、空格以及製表符):

<xs:element name="address">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="replace"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

這個例子也定義了帶有一個限定的名爲 "address" 的元素。這個 whiteSpace 限定被設置爲 "collapse",這意味着 XML 處理器將移除全部空白字符(換行、回車、空格以及製表符會被替換爲空格,開頭和結尾的空格會被移除,而多個連續的空格會被縮減爲一個單一的空格):

<xs:element name="address">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="collapse"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

對長度的限定

如需限制元素中值的長度,咱們須要使用 length、maxLength 以及 minLength 限定。

本例定義了帶有一個限定且名爲 "password" 的元素。其值必須精確到 8 個字符:

<xs:element name="password">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:length value="8"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

這個例子也定義了帶有一個限定的名爲 "password" 的元素。其值最小爲 5 個字符,最大爲 8 個字符:

<xs:element name="password">

<xs:simpleType>
  <xs:restriction base="xs:string">
    <xs:minLength value="5"/>
    <xs:maxLength value="8"/>
  </xs:restriction>
</xs:simpleType>

</xs:element>

數據類型的限定

標籤添加了一個 xmlns 屬性,這樣就爲前綴賦予了一個與某個命名空間相關聯的限定名稱。
限定 描述
enumeration 定義可接受值的一個列表
fractionDigits 定義所容許的最大的小數位數。必須大於等於0。
length 定義所容許的字符或者列表項目的精確數目。必須大於或等於0。
maxExclusive 定義數值的上限。所容許的值必須小於此值。
maxInclusive 定義數值的上限。所容許的值必須小於或等於此值。
maxLength 定義所容許的字符或者列表項目的最大數目。必須大於或等於0。
minExclusive 定義數值的下限。所容許的值必需大於此值。
minInclusive 定義數值的下限。所容許的值必需大於或等於此值。
minLength 定義所容許的字符或者列表項目的最小數目。必須大於或等於0。
pattern 定義可接受的字符的精確序列。
totalDigits 定義所容許的阿拉伯數字的精確位數。必須大於0。
whiteSpace 定義空白字符(換行、回車、空格以及製表符)的處理方式。

XSD 複合類型指示器

混合的複合類型可包含屬性、元素以及文本。

帶有混合內容的複合類型

XML 元素,"letter",含有文本以及其餘元素:

<letter>
Dear Mr.<name>John Smith</name>.
Your order <orderid>1032</orderid>
will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>

下面這個 schema 聲明瞭這個 "letter" 元素:

<xs:element name="letter">
  <xs:complexType mixed="true">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="orderid" type="xs:positiveInteger"/>
      <xs:element name="shipdate" type="xs:date"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

註釋:爲了使字符數據能夠出如今 "letter" 的子元素之間,mixed 屬性必須被設置爲 "true"。xs:sequence 標籤 (name、orderid 以及 shipdate ) 意味着被定義的元素必須依次出如今 "letter" 元素內部。

咱們也能夠爲 complexType 元素起一個名字,並讓 "letter" 元素的 type 屬性引用 complexType 的這個名稱(經過這個方法,若干元素都可引用同一個複合類型):

<xs:element name="letter" type="lettertype"/>

<xs:complexType name="lettertype" mixed="true">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="orderid" type="xs:positiveInteger"/>
    <xs:element name="shipdate" type="xs:date"/>
  </xs:sequence>
</xs:complexType>

XSD 複合類型指示器

經過指示器,咱們能夠控制在文檔中使用元素的方式。

指示器

有七種指示器:

Order 指示器:

  • All
  • Choice
  • Sequence

Occurrence 指示器:

  • maxOccurs
  • minOccurs

Group 指示器:

  • Group name
  • attributeGroup name

Order 指示器

Order 指示器用於定義元素的順序。

All 指示器

指示器規定子元素能夠按照任意順序出現,且每一個子元素必須只出現一次:

<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

註釋:當使用 指示器時,你能夠把 設置爲 0 或者 1,而只能把 指示器設置爲 1(稍後將講解 以及 )。

Choice 指示器

指示器規定可出現某個子元素或者可出現另一個子元素(非此即彼):

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

提示:如需設置子元素出現任意次數,可將 (稍後會講解)設置爲 unbounded(無限次)。

Sequence 指示器

規定子元素必須按照特定的順序出現:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Occurrence 指示器

Occurrence 指示器用於定義某個元素出現的頻率。

註釋:對於全部的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默認值均爲 1。

maxOccurs 指示器

指示器可規定某個元素可出現的最大次數:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的例子代表,子元素 "child_name" 可在 "person" 元素中最少出現一次(其中 minOccurs 的默認值是 1),最多出現 10 次。

minOccurs 指示器

指示器可規定某個元素可以出現的最小次數:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string"
      maxOccurs="10" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的例子代表,子元素 "child_name" 可在 "person" 元素中出現最少 0 次,最多出現 10 次。

提示:如需使某個元素的出現次數不受限制,請使用 maxOccurs="unbounded" 這個聲明:

一個實際的例子:

名爲 "Myfamily.xml" 的 XML 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="family.xsd">

<person>
<full_name>Tony Smith</full_name>
<child_name>Cecilie</child_name>
</person>

<person>
<full_name>David Smith</full_name>
<child_name>Jogn</child_name>
<child_name>mike</child_name>
<child_name>kyle</child_name>
<child_name>mary</child_name>
</person>

<person>
<full_name>Michael Smith</full_name>
</person>

</persons>

上面這個 XML 文件含有一個名爲 "persons" 的根元素。在這個根元素內部,咱們定義了三個 "person" 元素。每一個 "person" 元素必須含有一個 "full_name" 元素,同時它能夠包含多至 5 個 "child_name" 元素。

這是schema文件"family.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">

<xs:element name="persons">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="person" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="full_name" type="xs:string"/>
            <xs:element name="child_name" type="xs:string"
            minOccurs="0" maxOccurs="5"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

Group 指示器

Group 指示器用於定義相關的數批元素。

元素組

元素組經過 group 聲明進行定義:

<xs:group name="組名稱">
  ...
</xs:group>

您必須在 group 聲明內部定義一個 all、choice 或者 sequence 元素。下面這個例子定義了名爲 "persongroup" 的 group,它定義了必須按照精確的順序出現的一組元素:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

在您把 group 定義完畢之後,就能夠在另外一個定義中引用它了:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

屬性組

屬性組經過 attributeGroup 聲明來進行定義:

<xs:attributeGroup name="組名稱">
  ...
</xs:attributeGroup>

下面這個例子定義了名爲 "personattrgroup" 的一個屬性組:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

在您已定義完畢屬性組以後,就能夠在另外一個定義中引用它了,就像這樣:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

<xs:element name="person">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element>

XSD 元素

** 元素使咱們有能力經過未被 schema 規定的元素來拓展 XML 文檔!**

元素

元素使咱們有能力經過未被 schema 規定的元素來拓展 XML 文檔!

下面這個例子是從名爲 "family.xsd" 的 XML schema 中引用的片斷。它展現了一個針對 "person" 元素的聲明。經過使用 元素,咱們能夠經過任何元素(在 以後)擴展 "person" 的內容:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如今,咱們但願使用 "children" 元素來擴展 "person" 元素。這此種狀況下咱們就能夠這麼作,即便以上這個 schema 的做者沒有聲明任何 "children" 元素。

請看這個 schema 文件,名爲 "children.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">

<xs:element name="children">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="childname" type="xs:string"
      maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

下面這個 XML 文件(名爲 "Myfamily.xml"),使用了來自兩個不一樣的 schema 中的成分,"family.xsd" 和 "children.xsd":

<?xml version="1.0" encoding="ISO-8859-1"?>

<persons xmlns="http://www.microsoft.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:SchemaLocation="http://www.microsoft.com family.xsd
http://www.w3school.com.cn children.xsd">

<person>
<firstname>David</firstname>
<lastname>Smith</lastname>
<children>
  <childname>mike</childname>
</children>
</person>

<person>
<firstname>Tony</firstname>
<lastname>Smith</lastname>
</person>

</persons>

上面這個 XML 文件是有效的,這是因爲 schema "family.xsd" 容許咱們經過在 "lastname" 元素後的可選元素來擴展 "person" 元素。

都可用於製做可擴展的文檔!它們使文檔有能力包含未在主 XML schema 中聲明過的附加元素。

一個 XSD 實例

本節會爲您演示如何編寫一個 XML Schema。您還將學習到編寫 schema 的不一樣方法。

XML 文檔

讓咱們看看這個名爲 "shiporder.xml" 的 XML 文檔:

<?xml version="1.0" encoding="ISO-8859-1"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
 <orderperson>George Bush</orderperson>
 <shipto>
  <name>John Adams</name>
  <address>Oxford Street</address>
  <city>London</city>
  <country>UK</country>
 </shipto>
 <item>
  <title>Empire Burlesque</title>
  <note>Special Edition</note>
  <quantity>1</quantity>
  <price>10.90</price>
 </item>
 <item>
  <title>Hide your heart</title>
  <quantity>1</quantity>
  <price>9.90</price>
 </item>
</shiporder>

上面的XML文檔包括根元素 "shiporder",其中包含必須名爲 "orderid" 的屬性。"shiporder" 元素包含三個不一樣的子元素:"orderperson"、"shipto" 以及 "item"。"item" 元素出現了兩次,它含有一個 "title"、一個可選 "note" 元素、一個 "quantity" 以及一個 "price" 元素。

上面這一行 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance",告知XML解析器根據某個 schema 來驗證此文檔。這一行:xsi:noNamespaceSchemaLocation="shiporder.xsd" 規定了 schema 的位置(在這裏,它與 "shiporder.xml" 處於相同的文件夾)。

建立一個 XML Schema

如今,咱們須要爲上面這個 XML 文檔建立一個 schema。

咱們能夠經過打開一個新的文件來開始,並把這個文件命名爲 "shiporder.xsd"。要建立schema,咱們僅僅須要簡單地遵循 XML 文檔中的結構,定義咱們所發現的每一個元素。首先咱們開始定義一個標準的 XML 聲明:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
...


</xs:schema>

在上面的 schema 中,咱們使用了標準的命名空間 (xs),與此命名空間相關聯的 URI 是 Schema 的語言定義(Schema language definition),其標準值是 http://www.w3.org/2001/XMLSchema。

接下來,咱們須要定義 "shiporder" 元素。此元素擁有一個屬性,其中包含其餘的元素,所以咱們將它認定爲複合類型。"shiporder" 元素的子元素被 xs:sequence 元素包圍,定義了子元素的次序:

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
  ...
  ...
  </xs:sequence>
  ...
 </xs:complexType>
</xs:element>

而後咱們須要把 "orderperson" 元素定義爲簡易類型(這是由於它不包含任何屬性或者其餘的元素)。類型 (xs:string) 的前綴是由命名空間的前綴規定的,此命名空間與指示預約義的 schema 數據類型的 XML schema 相關聯:

<xs:element name="orderperson" type="xs:string"/>

接下來,我須要把兩個元素定義爲複合類型:"shipto" 和 "item"。咱們從定義 "shipto" 元素開始:

<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="name" type="xs:string"/>
   <xs:element name="address" type="xs:string"/>
   <xs:element name="city" type="xs:string"/>
   <xs:element name="country" type="xs:string"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

經過 schema,咱們可以使用 maxOccurs 和 minOccurs 屬性來定義某個元素可能出現的次數。maxOccurs 定義某元素出現次數的最大值,而 minOccurs 則定義某元素出現次數的最小值。maxOccurs 和 minOccurs 的默認值都是 1!

如今,咱們能夠定義 "item" 元素了。這個元素可在 "shiporder" 元素內部出現屢次。這是經過把 "item" 元素的 maxOccurs 屬性的值設定爲 "unbounded" 來實現的,這樣 "item" 元素就可出現創做者所但願的任意屢次。請注意,"note" 元素是可選元素。咱們已經把此元素的 minOccurs 屬性設定爲 0 了:

<xs:element name="item" maxOccurs="unbounded">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="title" type="xs:string"/>
   <xs:element name="note" type="xs:string" minOccurs="0"/>
   <xs:element name="quantity" type="xs:positiveInteger"/>
   <xs:element name="price" type="xs:decimal"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

如今,咱們能夠聲明 "shiporder" 元素的屬性了。因爲這是一個必選屬性,咱們規定 use="required"。

註釋:此屬性的聲明必須被置於最後:

<xs:attribute name="orderid" type="xs:string" use="required"/>

這是這個名爲 "shiporder.xsd" 的 schema 文件的文檔清單:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element name="orderperson" type="xs:string"/>
   <xs:element name="shipto">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" type="xs:string"/>
      <xs:element name="country" type="xs:string"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
   <xs:element name="item" maxOccurs="unbounded">
    <xs:complexType>
     <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="quantity" type="xs:positiveInteger"/>
      <xs:element name="price" type="xs:decimal"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
  <xs:attribute name="orderid" type="xs:string" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema>

分割 Schema

前面的設計方法很是容易,但當文檔很複雜時卻難以閱讀和維護。

接下來介紹的設計方法基於首先對全部元素和屬性的定義,而後再使用 ref 屬性來引用它們。

這是用新方法設計的 schema 文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!-- 簡易元素的定義 -->
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>

<!-- 屬性的定義 -->
<xs:attribute name="orderid" type="xs:string"/>

<!-- 複合元素的定義 -->
<xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="name"/>
   <xs:element ref="address"/>
   <xs:element ref="city"/>
   <xs:element ref="country"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="item">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="title"/>
   <xs:element ref="note" minOccurs="0"/>
   <xs:element ref="quantity"/>
   <xs:element ref="price"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="orderperson"/>
   <xs:element ref="shipto"/>
   <xs:element ref="item" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute ref="orderid" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema>

使用指定的類型(Named Types)

第三種設計方法定義了類或者類型,這樣使咱們有能力重複使用元素的定義。具體的方式是:首先對簡易元素和複合元素進行命名,而後經過元素的 type 屬性來指向它們。

這是利用第三種方法設計的 schema 文件 ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype">
 <xs:restriction base="xs:string"/>
</xs:simpleType>

<xs:simpleType name="inttype">
 <xs:restriction base="xs:positiveInteger"/>
</xs:simpleType>

<xs:simpleType name="dectype">
 <xs:restriction base="xs:decimal"/>
</xs:simpleType>

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

<xs:complexType name="shiptotype">
 <xs:sequence>
  <xs:element name="name" type="stringtype"/>
  <xs:element name="address" type="stringtype"/>
  <xs:element name="city" type="stringtype"/>
  <xs:element name="country" type="stringtype"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
 <xs:sequence>
  <xs:element name="title" type="stringtype"/>
  <xs:element name="note" type="stringtype" minOccurs="0"/>
  <xs:element name="quantity" type="inttype"/>
  <xs:element name="price" type="dectype"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
 <xs:sequence>
  <xs:element name="orderperson" type="stringtype"/>
  <xs:element name="shipto" type="shiptotype"/>
  <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
 </xs:sequence>
 <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

restriction 元素顯示出數據類型源自於 W3C XML Schema 命名空間的數據類型。所以,下面的片斷也就意味着元素或屬性的值必須是字符串類型的值:

<xs:restriction base="xs:string">

restriction 元素常被用於向元素施加限制。請看下面這些來自以上 schema 的片斷:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

這段代碼指示出,元素或屬性的值必須爲字符串,而且必須是連續的六個字符,同時這些字符必須是 0-9 的數字。

Blog: https://blog.yilon.top

相關文章
相關標籤/搜索