溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么使用XML Schema定義元素

發(fā)布時(shí)間:2021-03-12 11:39:55 來源:億速云 閱讀:185 作者:小新 欄目:編程語言

這篇文章主要介紹怎么使用XML Schema定義元素,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

XML Schema 比 DTD 更強(qiáng)大。為了說明 XML Schema 機(jī)制的強(qiáng)大功能,下面三個(gè)程序清單簡要比較了表示元素的不同方式。 清單 1給出了一個(gè) XML 文檔段, 清單 2用 DTD 語法聲明了這兩個(gè)元素, 清單 3則是相應(yīng)的 XML Schema 語法形式。要注意, 清單 3中所用的是相同的 XML 語法。通過模式,驗(yàn)證解析器可以檢查元素 InvoiceNo 是否是正整數(shù),元素 ProductID 的首字符是否為 A 到 Z 之間的字母,后面為六個(gè)阿拉伯?dāng)?shù)字。相反,引用 DTD 的驗(yàn)證解析器只能檢查這些元素是否用字符串表示。

清單 1:XML 文檔段

<InvoiceNo>123456789</InvoiceNo>
<ProductID>J123456</ProductID>

清單 2:描述清單 1 中元素的 DTD 段

<!ELEMENT InvoiceNo (#PCDATA)>
<!ELEMENT ProductID (#PCDATA)>

清單 3:描述清單 1 中元素的 XML Schema

<element name='InvoiceNo' type='positive-integer'/>
<element name='ProductID' type='ProductCode'/>
<simpleType name='ProductCode' base='string'>
<pattern value='[A-Z]{1}d{6}'/>
</simpleType>

在 XML Schema 中使用名稱空間

在這個(gè)協(xié)作的世界中,一個(gè)人可能處理來自多個(gè)其他團(tuán)體的文檔,而不同的團(tuán)體可能希望以不同的方式表示他們的數(shù)據(jù)元素。此外,他們還可能在一個(gè)文檔中引用不同團(tuán)體創(chuàng)建的同名元素。如何區(qū)分相同名字的不同定義呢?XML Schema 使用名稱空間區(qū)分這些定義。

附:

DTD 的局限性

(盡管作為描述結(jié)構(gòu)化信息的一種機(jī)制,DTD 成功地為 SGML 和 HTML 開發(fā)人員服務(wù)了 20 年,但與 XML Schema 相比,它存在著嚴(yán)重的局限性。

DTD 要求元素由以下三種成分組成:

文本字符串

文本字符串與其他子元素的混合

一組子元素

DTD 不使用 XML 語法,對(duì)類型和名稱空間僅提供有限的支持。)

一個(gè)給定的 XML Schema 定義了一組新名字,如元素名、類型名、屬性名、屬性組名,這些名字的定義和聲明都寫在模式中。 清單 3定義的名字包括 InvoiceNo 、 ProductID 和 ProductCode 。

我們說模式中定義的名字屬于它的 目標(biāo)名稱空間。名稱空間本身有一個(gè)固定但沒有限制的名字,必須符合 URL 語法。比如,對(duì)于 清單 3中模式段,您可以把名稱空間的名字設(shè)為: http://www.SampleStore.com/Account 。

名稱空間的名字語法容易讓人混淆,盡管以 http:// 開始,那個(gè) URL 并不指向一個(gè)包含模式定義的文件。事實(shí)上,這個(gè) URL http://www.SampleStore.com/Account 根本沒有指向任何文件,只是一個(gè)分配的名字。

模式中的定義和聲明可能引用屬于其他名稱空間的名字。在本文中,我們稱這些名稱空間為 源名稱空間。每個(gè)模式都有一個(gè)目標(biāo)名稱空間,但可能有多個(gè)源名稱空間。名稱空間的名字可能相當(dāng)長,但在 XML 文檔中通過 xmlns 聲明可使用簡寫形式。為了說明這些概念,我們可以向前述 清單 4中的示例模式中添加更多的內(nèi)容。

清單 4:目標(biāo)名稱空間和源名稱空間

<!--XML Schema fragment in file schema1.xsd-->

<xsd:schema targetNamespace='http://www.SampleStore.com/Account'
xmlns:xsd='http://www.w3.org/1999/XMLSchema'
xmlns:ACC= 'http://www.SampleStore.com/Account'>
<xsd:element name='InvoiceNo' type='xsd:positive-integer'/>
<xsd:element name='ProductID' type='ACC:ProductCode'/>
<xsd:simpleType name='ProductCode' base='xsd:string'>
<xsd:pattern value='[A-Z]{1}d{6}'/>
</xsd:simpleType>

在 清單 4的 XML Schema 中, targetNamespace 的名字是www.SampleStore.com/Account ,其中包含的名字有 InvoiceNo 、 ProductID 和 ProductCode 。 schema 、 element 、 simpleType 、 pattern 、 string 和 positive-integer 這些名字屬于源名稱空間 www.w3.org/1999/XMLSchema ,通過 xmlns 聲明縮寫為 xsd 。別名 xsd 沒有任何特殊的地方,我們可以選擇任何其他的名字。在本文后面的部分為了方便和簡化起見,我們使用 xsd 代表名稱空間 www.w3.org/1999/XMLSchema ,在一些代碼段中省略了限定符 xsd 。在這個(gè)例子中, targetNamespace 偶爾也作為一個(gè)源名稱空間,因?yàn)橐褂妹?ProductCode 定義其他的名字。

怎么使用XML Schema定義元素

清單 4中的模式段不需要指定源模式文件的位置。對(duì)于整個(gè)“模式的模式”, http://www.w3.org/1999/XMLSchema ,不需要指定位置,因?yàn)樗奈恢檬侨怂仓?。?duì)于源名稱空間 www.SampleStore.com/Account ,也不需要指定位置,因?yàn)樗『檬窃撐募卸x的目標(biāo)名稱空間。為了更好地理解如何指定模式的位置和使用默認(rèn)名稱空間,看一看 清單 5中擴(kuò)展的例子。

清單 5:多個(gè)源名稱空間,導(dǎo)入一個(gè)名稱空間

<!--XML Schema fragment in file schema1.xsd-->
<schema targetNamespace='http://www.SampleStore.com/Account'
xmlns='http://www.w3.org/1999/XMLSchema'
xmlns:ACC= 'http://www.SampleStore.com/Account'
xmlns:PART= 'http://www.PartnerStore.com/PartsCatalog'>
<import namespace='http://www.PartnerStore.com/PartsCatalog'
schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/>
<element name='InvoiceNo' type='positive-integer'/>
<element name='ProductID' type='ACC:ProductCode'/>
<simpleType name='ProductCode' base='string'>
<pattern value='[A-Z]{1}d{6}'/>
</simpleType>
<element name='stickyGlue' type='PART:SuperGlueType'/>

清單 5中多了一個(gè)名稱空間引用: www.PartnerStore.com/PartsCatalog 。這個(gè)名稱空間不同于 targetNamespace 和標(biāo)準(zhǔn)名稱空間。因此必須使用 import 聲明元素引入,該元素的 schemaLocation 屬性指明包含模式的文件位置。默認(rèn)的名稱空間是www.w3.org/1999/XMLSchema ,它的 xmlns 聲明沒有名字。每個(gè)非限定的名字如 schema 和 element ,都屬于默認(rèn)名稱空間www.w3.org/1999/XMLSchema 。如果模式從一個(gè)名稱空間中引用了多個(gè)名字,將其指定為默認(rèn)名字空間更方便。

一個(gè) XML 實(shí)例文檔可能引用多個(gè)名稱空間的元素名,這些名稱空間定義在不同模式中。為了引用和簡化名稱空間的名字,同樣要使用 xmlns 聲明。我們使用 XML Schema 實(shí)例名稱空間的 schemaLocation 屬性指定文件的位置。要注意,該屬性不同于上一個(gè)例子中 xsd 名稱空間的同名屬性 schemaLocation 。

清單 6:使用來自多個(gè)模式的多個(gè)名稱空間的名字

<?xml version="1.0"?>
<ACC:rootElement xmlns:ACC='http://www.SampleStore.com/Account'
xmlns:PART='http://www.PartnerStore.com/PartsCatalog'
xmlns:xsi='http://www.w3.org/1999/XMLSchema-instance'
xsi:schemaLocation='http://www.PartnerStore.com/PartsCatalog
http://www.ProductStandards.org/repository/alpha.xsd
http://www.SampleStore.com/Account
http://www.SampleStore.com/repository/schema1.xsd'>
<ACC:InvoiceNo>123456789</ACC:InvoiceNo>

圖 2:清單 5 和清單 6 的名稱空間

怎么使用XML Schema定義元素

定義元素

定義元素就是定義元素的名字和內(nèi)容模型。在 XML Schema 中,元素的內(nèi)容模型由其類型定義,因此 XML 文檔中實(shí)例元素的值必須符合模式中定義的類型。

類型包括簡單類型和復(fù)雜類型。簡單類型的值不能包含元素或?qū)傩浴?fù)雜類型可以產(chǎn)生在其他元素中嵌套元素的效果,或者為元素增加屬性。(到目前為止本文中的例子都是用戶定義的簡單類型,比如 ProductCode )。XML Schema 規(guī)范也包括預(yù)定義的簡單類型(請(qǐng)參閱側(cè)欄 簡單類型)。 派生的簡單類型約束了基類型的值。比如,派生簡單類型 ProductCode 的值是基類型 string 值的子集。

簡單的、非嵌套的元素是簡單類型

不含屬性或其他元素的元素可以定義為簡單類型,無論是預(yù)定義的簡單類型還是用戶定義的簡單類型,如 string 、 integer 、 decimal 、 time 、 ProductCode 等等。

清單 7:一些元素的簡單類型

<element name='age' type='integer'/>
<element name='price' type='decimal'/>

帶有屬性的元素必須是復(fù)雜類型

現(xiàn)在,試著向 清單 7中的簡單元素 price 增加屬性 currency 。您不能這樣做,因?yàn)楹唵晤愋偷脑夭荒苡袑傩浴H绻M黾訉傩?,您必須?price 元素定義成復(fù)雜類型。在 清單 8的例子中,我們定義了一個(gè) 匿名類型,沒有明確地命名這個(gè)復(fù)雜類型。換句話說,沒有定義復(fù)雜類型 complexType 的 name 屬性。

清單 8:一個(gè)復(fù)雜元素類型

<element name='price'>
<complexType base='decimal' derivedBy='extension'>
<attribute name='currency' type='string'/>
</complexType>
</element>
<!-- In XML instance document, we can write: <price currency='US'>45.50</price> -->

嵌入其他元素的元素必須是復(fù)雜類型

在 XML 文檔中,一個(gè)元素可能嵌入其他的元素。這種要求可以在 DTD 中直接表示。但 XML Schema 定義一個(gè)元素,這個(gè)元素有一個(gè)類型,而這個(gè)類型可以包含其他元素和屬性的聲明。 表 1給出了一個(gè)簡單的例子。

表 1:DTD 和 XML Schema 中復(fù)雜數(shù)據(jù)類型的比較

XML 文檔

<Book>
<Title>Cool XML<Title>
<Author>Cool Guy</Author>
</Book>

DTD

<Book>
<Title>Cool XML<Title>
<Author>Cool Guy</Author>
</Book>

XML Schema

<Book>
<Title>Cool XML<Title>
<Author>Cool Guy</Author>
</Book>


<!ELEMENT Book (Title, Author)>
<!ELEMENT Title (#PCDATA)>
<!ELEMENT Author (#PCDATA)>

<element name='Book' type='BookType'/>
<complexType name='BookType'>
<element name='Title' type='string'/>
<element name='Author' type='string'/>
</complexType>

盡管 表 1中的 XML 代碼同時(shí)滿足 DTD 與 XML Schema 段,但兩者之間有一個(gè)很大的區(qū)別。在 DTD 中所有的元素都是全局性的,而表中的 XML Schema 允許把 Title 和 Author 定義成局部的——只出現(xiàn)在元素 Book 中。為了在 XML Schema 中實(shí)現(xiàn)與 DTD 聲明完全相同的效果,元素 Title 和 Author 必須是全局范圍的,如 清單 9中所示。元素 element 的 ref 屬性使您能夠引用前面聲明的元素。

清單 9:用全局簡單類型定義的復(fù)雜類型

<element name='Title' type='string'/>
<element name='Author' type='string'/>
<element name='Book' type='BookType'/>
<complexType name='BookType'>
<element ref='Title'/>
<element ref='Author'/>
</complexType>

在 表 1和 清單 9所示的例子中, BookType 是全局性的,可用于聲明其他元素。相反, 清單 10將該類型局部地定義到元素 Book 中,而且定義成匿名元素。要注意, 表 1中的 XML 文檔段與表 1、 清單 9和 清單 10中三個(gè)模式段都匹配。

清單 10:隱藏 BookType 作為本地類型

<element name='Title' type='string'/>
<element name='Author' type='string'/>
<element name='Book'>
<complexType>
<element ref='Title'/>
<element ref='Author'/>
</complexType>
</element>

表示元素的復(fù)雜約束

對(duì)于表示元素內(nèi)容模型的約束,XML Schema 比 DTD 提供了更大的靈活性。在最簡單的層次上,像在 DTD 中那樣,您可以把屬性和元素聲明關(guān)聯(lián)起來,指明能夠出現(xiàn)的給定元素集合序列:只能出現(xiàn) 1 次(1)、出現(xiàn) 0 次或多次(*)或者出現(xiàn) 1 次或多次(+)。您還可以表示 XML Schema 中的其他約束,比方說使用 element 元素的 minOccurs 和 maxOccurs 屬性,以及 choice 、 group 和 all 元素。

清單 11:表示元素類型的約束

<element name='Title' type='string'/>
<element name='Author' type='string'/>
<element name='Book'>
<complexType>
<element ref='Title' minOccurs='0'/>
<element ref='Author' maxOccurs='2'/>
</complexType>
</element>

在 清單 11中, Book 中 Title 的出現(xiàn)是可選的(類似 DTD 的 '?')。但是, 清單 11也說明 Book 元素中至少要有一個(gè)但不能超過兩個(gè)作者。 element 的 minOccurs 和 maxOccurs 屬性的默認(rèn)值是 1。元素 choice 只允許它的一個(gè)子女出現(xiàn)在實(shí)例中。另外一個(gè)元素 all ,表示這樣的約束:組中的所有子元素可以同時(shí)出現(xiàn)一次,或者都不出現(xiàn),它們可以按任意的順序出現(xiàn)。 清單 12表示 Title 和 Author 兩者必須同時(shí)出現(xiàn)(順序任意)在 Book 中,或者都不出現(xiàn)。這種約束很難在 DTD 中表示。

清單 12:指出必須為元素定義所有的類型

<xsd:element name='Title' type='string'/>
<xsd:element name='Author' type='string'/>
<xsd:element name='Book'>
<xsd:complexType>
<xsd:all>
<xsd:element ref='Tile'/>
<xsd:element ref='Author'/>
</xsd:all>
</xsd:complexType>
</xsd:element>

更上層樓

我們已經(jīng)討論了在 XML Schema 中定義元素所需的最基本的概念,通過一些簡單的例子使您領(lǐng)略到它的強(qiáng)大功能。還有一些更強(qiáng)大的機(jī)制:

XML Schema 對(duì)類型繼承提供了廣泛的支持,允許重用以前定義的結(jié)構(gòu)。使用所謂的 facets,您可以派生新的類型,表示其他某個(gè)類型值的更小子集,比如通過枚舉、范圍或模式匹配來定義子集。在本文的例子中, ProductCode 類型就是使用模式面( pattern facet)定義的。子類型也可以向基類型增加更多的元素和屬性聲明。

有幾種機(jī)制控制能否定義子類型,或者能否在具體的文檔中替換為子類型。比如,有可能表示 InvoiceType ( Invoice 編號(hào)的類型)不允許子類型化,任何人都不能定義新版本的 InvoiceType 。通過規(guī)定在特定的上下文中不能用 ProductCode 類型的子類型替換,也能表達(dá)這種約束。

除了子類型外,還可以定義等價(jià)的類型,這樣,一個(gè)類型的值可以用另一個(gè)類型代替。

通過聲明抽象的元素或者類型,XML Schema 提供了一種強(qiáng)制替換機(jī)制。

為了方便起見,可以定義并命名屬性組和元素組,從而能夠在后面引用這些組達(dá)到重用的目的。

XML Schema 提供了三個(gè)元素—— appInfo 、 documentation 和 annotation ——為模式作注解,以方便讀者( documentation )和應(yīng)用程序( appInfo )。

基于子元素的某些屬性可以表示惟一性約束。

可以通過 W3C 站點(diǎn)(請(qǐng)參閱 參考資料)的文檔進(jìn)一步研究 XML Schema,或者訪問 dW XML 專區(qū)了解更多的內(nèi)容。目前,XML Schema 規(guī)范已經(jīng)被批準(zhǔn),并成為候選推薦標(biāo)準(zhǔn)(Candidate Recommendation),毫無疑問您將越來越多地用到它。

以上是“怎么使用XML Schema定義元素”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI