Blog: https://blog.yilon.tophtml
XML 是對 HTML 的補充。node
XML 不會替代 HTML,理解這一點很重要。在大多數 Web 應用程序中,XML 用於傳輸數據,而 HTML 用於格式化並顯示數據。git
對 XML 最好的描述是:數據庫
XML 是獨立於軟件和硬件的信息傳輸工具。瀏覽器
XML 應用於 Web 開發的許多方面,經常使用於簡化數據的存儲和共享。服務器
若是您須要在 HTML 文檔中顯示動態數據,那麼每當數據改變時將花費大量的時間來編輯 HTML。網絡
經過 XML,數據可以存儲在獨立的 XML 文件中。這樣您就能夠專一於使用 HTML/CSS 進行顯示和佈局,並確保修改底層數據再也不須要對 HTML 進行任何的改變。dom
經過使用幾行 JavaScript 代碼,您就能夠讀取一個外部 XML 文件,並更新您的網頁的數據內容。編輯器
在真實的世界中,計算機系統和數據使用不兼容的格式來存儲數據。ide
XML 數據以純文本格式進行存儲,所以提供了一種獨立於軟件和硬件的數據存儲方法。
這讓建立不一樣應用程序能夠共享的數據變得更加容易。
對開發人員來講,其中一項最費時的挑戰一直是在互聯網上的不兼容系統之間交換數據。
因爲能夠經過各類不兼容的應用程序來讀取數據,以 XML 交換數據下降了這種複雜性。
升級到新的系統(硬件或軟件平臺),老是很是費時的。必須轉換大量的數據,不兼容的數據常常會丟失。
XML 數據以文本格式存儲。這使得 XML 在不損失數據的狀況下,更容易擴展或升級到新的操做系統、新的應用程序或新的瀏覽器。
不一樣的應用程序都可以訪問您的數據,不只僅在 HTML 頁中,也能夠從 XML 數據源中進行訪問。
經過 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 中,標籤
必須使用相同的大小寫來編寫打開標籤和關閉標籤:
<Message>這是錯誤的。</message> <message>這是正確的。</message>
註釋:打開標籤和關閉標籤一般被稱爲開始標籤和結束標籤。不論您喜歡哪一種術語,它們的概念都是相同的。
在 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 文檔必須有一個元素是全部其餘元素的父元素。該元素稱爲根元素。
<root> <child> <subchild>.....</subchild> </child> </root>
與 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 < 1000 then</message>
在 XML 中,有 5 個預約義的實體引用:
< | < | 小於 |
---|---|---|
> | > | 大於 |
& | & | 和號 |
' | ' | 單引號 |
" | " | 引號 |
註釋:在 XML 中,只有字符 "<" 和 "&" 確實是非法的。大於號是合法的,可是用實體引用來代替它是一個好習慣。
在 XML 中編寫註釋的語法與 HTML 的語法很類似:
<!-- This is a comment -->
HTML 會把多個連續的空格字符裁減(合併)爲一個:
HTML: Hello my name is David. 輸出: Hello my name is David.
在 XML 中,文檔中的空格不會被刪節。
在 Windows 應用程序中,換行一般以一對字符來存儲:回車符 (CR) 和換行符 (LF)。這對字符與打字機設置新行的動做有類似之處。在 Unix 應用程序中,新行以 LF 字符存儲。而 Macintosh 應用程序使用 CR 來存儲新行。
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>
在上例中,
在上例中,只有
XML 元素必須遵循如下命名規則:
可以使用任何名稱,沒有保留的字詞。
使名稱具備描述性。使用下劃線的名稱也很不錯。
名稱應當比較簡短,好比:<book_title>,而不是:<the_title_of_the_book>。
避免 "-" 字符。若是您按照這樣的方式進行命名:"first-name",一些軟件會認爲你須要提取第一個單詞。
避免 "." 字符。若是您按照這樣的方式進行命名:"first.name",一些軟件會認爲 "name" 是對象 "first" 的屬性。
避免 ":" 字符。冒號會被轉換爲命名空間來使用(稍後介紹)。
XML 文檔常常有一個對應的數據庫,其中的字段會對應 XML 文檔中的元素。有一個實用的經驗,即便用數據庫的名稱規則來命名 XML 文檔中的元素。
非英語的字母好比 éòá 也是合法的 XML 元素名,不過須要留意當軟件開發商不支持這些字符時可能出現的問題。
XML 元素是可擴展,以攜帶更多的信息。
XML 元素能夠在開始標籤中包含屬性,相似 HTML。
屬性 (Attribute) 提供關於元素的額外(附加)信息。
屬性值必須被引號包圍,不過單引號和雙引號都可使用。好比一我的的性別,person 標籤能夠這樣寫:
因使用屬性而引發的一些問題:
請儘可能使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。
不要作這樣的蠢事(這不是 XML 應該被使用的方式):
<note day="08" month="08" year="2008" to="George" from="John" heading="Reminder" body="Don't forget the meeting!"> </note>
有時候會向元素分配 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。
經過 DTD 驗證的 XML 是「合法」的 XML。
「形式良好」或「結構良好」的 XML 文檔擁有正確的語法。
「形式良好」(Well Formed)的 XML 文檔會遵照前幾章介紹過的 XML 語法規則:
XMLHttpRequest 對象用於在後臺與服務器交換數據。
XMLHttpRequest 對象用於在後臺與服務器交換數據。
XMLHttpRequest 對象是開發者的夢想,由於您可以:
全部現代的瀏覽器都支持 XMLHttpRequest 對象。
DOM (Document Object Model,文檔對象模型)定義了訪問和操做文檔的標準方法。
XML DOM (XML Document Object Model) 定義了訪問和操做 XML 文檔的標準方法。
DOM 把 XML 文檔做爲樹結構來查看。可以經過 DOM 樹來訪問全部元素。能夠修改或刪除它們的內容,並建立新的元素。元素,它們的文本,以及它們的屬性,都被認爲是節點。
在下面的例子中,咱們使用 DOM 引用從
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue
在 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>
如今,命名衝突不存在了,這是因爲兩個文檔都使用了不一樣的名稱來命名它們的
經過使用前綴,咱們建立了兩種不一樣類型的
這個 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/。
統一資源標識符是一串能夠標識因特網資源的字符。最經常使用的 URI 是用來標示因特網域名地址的統一資源定位器(URL)。另外一個不那麼經常使用的 URI 是統一資源命名(URN)。在咱們的例子中,咱們僅使用 URL。
爲元素定義默認的命名空間可讓咱們省去在全部的子元素中使用前綴的工做。
請使用下面的語法:
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 的 DTD 替代者。
XML Schema 可描述 XML 文檔的結構。
XML Schema 語言也可做爲 XSD(XML Schema Definition)來引用。
XML Schema 的做用是定義 XML 文檔的合法構建模塊,相似 DTD。
咱們認爲 XML Schema 很快會在大部分網絡應用程序中取代 DTD。
XML Schema 在 2001 年 5 月 2 日成爲 W3C 標準。
XML Schema 最重要的能力之一就是對數據類型的支持。
編者注:數據約束,或稱 facets,是 XML Schema 原型中的一個術語,中文可譯爲「面」,用來約束數據類型的允許值。
另外一個關於 XML Schema 的重要特性是,它們由 XML 編寫。
當數據從發送方被髮送到接受方時,其要點是雙方應有關於內容的相同的「指望值」。
經過 XML Schema,發送方能夠用一種接受方可以明白的方式來描述數據。
一種數據,好比 "03-11-2004",在某些國家被解釋爲11月3日,而在另外一些國家爲看成3月11日。
可是一個帶有數據類型的 XML 元素,好比:
XML Schema 是可擴展的,由於它們由 XML 編寫。
咱們把符合 XML 語法的文檔稱爲形式良好的 XML 文檔,好比:
即便文檔的形式良好,仍然不能保證它們不會包含錯誤,而且這些錯誤可能會產生嚴重的後果。
請考慮下面的狀況:您訂購的了 5 打激光打印機,而不是 5 臺。經過 XML Schema,大部分這樣的錯誤會被您的驗證軟件捕獲到。
** 元素是每個 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 文檔含有對 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"
XML Schema 可定義 XML 文件的元素。
簡易元素指那些只包含文本的元素。它不會包含任何其餘的元素或屬性。
簡易元素指那些僅包含文本的元素。它不會包含任何其餘的元素或屬性。
不過,「僅包含文本」這個限定卻很容易形成誤解。文本有不少類型。它能夠是 XML Schema 定義中包括的類型中的一種(布爾、字符串、數據等等),或者它也能夠是您自行定義的定製類型。
您也可向數據類型添加限定(即 facets),以此來限制它的內容,或者您能夠要求數據匹配某種特定的模式。
<xs:element name="xxx" type="yyy"/>
此處 xxx 指元素的名稱,yyy 指元素的數據類型。XML Schema 擁有不少內建的數據類型。
這是一些 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"/>
全部的屬性均做爲簡易類型來聲明。
簡易元素沒法擁有屬性。假如某個元素擁有屬性,它就會被看成某種複合類型。可是屬性自己老是做爲簡易類型被聲明的。
<xs:attribute name="xxx" type="yyy"/>
在此處,xxx 指屬性名稱,yyy 則規定屬性的數據類型。XML Schema 擁有不少內建的數據類型。
這是帶有屬性的 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 的知識。
限定(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>
限定 | 描述 |
---|---|
enumeration | 定義可接受值的一個列表 |
fractionDigits | 定義所容許的最大的小數位數。必須大於等於0。 |
length | 定義所容許的字符或者列表項目的精確數目。必須大於或等於0。 |
maxExclusive | 定義數值的上限。所容許的值必須小於此值。 |
maxInclusive | 定義數值的上限。所容許的值必須小於或等於此值。 |
maxLength | 定義所容許的字符或者列表項目的最大數目。必須大於或等於0。 |
minExclusive | 定義數值的下限。所容許的值必需大於此值。 |
minInclusive | 定義數值的下限。所容許的值必需大於或等於此值。 |
minLength | 定義所容許的字符或者列表項目的最小數目。必須大於或等於0。 |
pattern | 定義可接受的字符的精確序列。 |
totalDigits | 定義所容許的阿拉伯數字的精確位數。必須大於0。 |
whiteSpace | 定義空白字符(換行、回車、空格以及製表符)的處理方式。 |
混合的複合類型可包含屬性、元素以及文本。
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>
經過指示器,咱們能夠控制在文檔中使用元素的方式。
有七種指示器:
Order 指示器用於定義元素的順序。
<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>
註釋:當使用
<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>
提示:如需設置子元素出現任意次數,可將
<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 指示器用於定義某個元素出現的頻率。
註釋:對於全部的 "Order" 和 "Group" 指示器(any、all、choice、sequence、group name 以及 group reference),其中的 maxOccurs 以及 minOccurs 的默認值均爲 1。
<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 次。
<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 聲明進行定義:
<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>
** 元素使咱們有能力經過未被 schema 規定的元素來拓展 XML 文檔!**
下面這個例子是從名爲 "family.xsd" 的 XML schema 中引用的片斷。它展現了一個針對 "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。您還將學習到編寫 schema 的不一樣方法。
讓咱們看看這個名爲 "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。
咱們能夠經過打開一個新的文件來開始,並把這個文件命名爲 "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>
前面的設計方法很是容易,但當文檔很複雜時卻難以閱讀和維護。
接下來介紹的設計方法基於首先對全部元素和屬性的定義,而後再使用 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>
第三種設計方法定義了類或者類型,這樣使咱們有能力重複使用元素的定義。具體的方式是:首先對簡易元素和複合元素進行命名,而後經過元素的 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