欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
XML 文件:XML 架構快速指南 - MSDN Magazine,2002年4月
XML 架構快速指南
發(fā)布日期: 4/1/2004 | 更新日期: 4/1/2004
Aaron Skonnard
XML 文件存檔
下載本文的代碼:XML0204.exe (35KB)
在 所有的 XML 技術(shù)中,XML 架構對軟件開(kāi)發(fā)人員最具價(jià)值,因為是它最終使在 XML 文檔中加入類(lèi)型信息成為可能。本專(zhuān)欄是介紹 XML 架構基礎知識的兩部分系列文章中的第一部分。
首先,我們來(lái)回顧一下 XML 架構之前的知識。XML 1.0 規范附帶了一個(gè)描述 XML 詞匯的內置語(yǔ)法,稱(chēng)為文檔類(lèi)型定義 (DTD)。DTD 實(shí)際顧及到 XML 1.0是從前任語(yǔ)言 — 標準通用標記語(yǔ)言 (SGML) 那里繼承語(yǔ)法的已經(jīng)有一段時(shí)間了。
DTD 使您能夠描述 XML 文檔的結構。例如,假定要使用以下 XML 詞匯描述員工信息:
<employee id="555-12-3434"><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></employee>
以下 DTD 描述了本文檔的結構:
<!-- employee.dtd --><!ELEMENT employee (name, hiredate, salary)><!ATTLIST employeeid CDATA #REQUIRED><!ELEMENT name (#PCDATA)><!ELEMENT hiredate (#PCDATA)><!ELEMENT salary (#PCDATA)>
然后,該 DTD 能夠通過(guò)一個(gè) DOCTYPE 聲明和原始文檔相關(guān)聯(lián),如下所示:
<!DOCTYPE employee SYSTEM "employee.dtd"><employee id="555-12-3434"><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></employee>
驗證是使用 DTD 的主要優(yōu)勢。當 XML 1.0 驗證分析器讀取該 XML 1.0 文件時(shí),它也能夠讀取相關(guān)聯(lián)的 DTD 并驗證是否符合該定義。使用 DTD 進(jìn)行驗證能夠減少您必須置入應用程序的錯誤處理量。
盡管 DTD 非常適合很多基于 SGML 的電子出版應用程序,但當應用到諸如那些圍繞當今 Web 應用的現代軟件開(kāi)發(fā)領(lǐng)域時(shí),其局限性很快就顯現出來(lái)了。DTD 的主要限制是 DTD 語(yǔ)法和 XML 不兼容,而且 DTD 不支持命名空間、典型編程語(yǔ)言數據類(lèi)型或定義自定義類(lèi)型。
由于 DTD 語(yǔ)法本身不是 XML,所以不能使用標準的 XML 工具來(lái)程序化地處理這些定義。大多數 XML 1.0 處理器雖然支持 DTD 驗證,但由于語(yǔ)法的復雜性,它不支持對 DTD中找到的信息進(jìn)行程序化訪(fǎng)問(wèn)。
因為 DTD 甚至在命名空間存在以前就產(chǎn)生了,所以它們不能很好地協(xié)同工作就不奇怪了。事實(shí)上,使用 DTD 描述可識別命名空間的文檔就像將一個(gè)方形木栓敲進(jìn)一個(gè)圓孔一樣。有關(guān)如何才能艱難地實(shí)現上述功能的詳細信息,請查看 2001 年 5 月期的XML 文件專(zhuān)欄。在該專(zhuān)欄中,我提供了一個(gè)可識別命名空間的示例 DTD。因此,大多數開(kāi)發(fā)人員要么選用DTD,要么選用命名空間,但沒(méi)有兩個(gè)同時(shí)選用的。
DTD 也是專(zhuān)門(mén)為以文擋為中心的系統而設計的,在這 種系統中通常不存在程序化數據類(lèi)型。因此,只存在少數類(lèi)型標識符用于描述屬性(參見(jiàn)圖 1)。這些類(lèi)型標識符和您過(guò)去在編程語(yǔ)言里慣于使用的大不相同。它們實(shí)際上僅僅是文本的特例 (CDATA)。而且,這些類(lèi)型不能應用于純文本元素,只能應用于屬性。
最后,DTD 類(lèi)型系統是不可擴展的。這意味著(zhù)您不得不使用圖 1中描述的類(lèi)型。創(chuàng )建在您的問(wèn)題領(lǐng)域中有意義的自定 義類(lèi)型不屬于 DTD 問(wèn)題的范疇。在面對 XML 架構展現的全新而又令人振奮的未來(lái)時(shí),這些局限足以讓任何 XML 開(kāi)發(fā)人員回避使用 DTD。
XML 架構基礎知識
XML 架構本身是一個(gè)用于描述 XML 實(shí)例文檔的 XML 詞匯。我之所以使用“實(shí)例”一詞,是因為一個(gè)架構會(huì )描述一類(lèi)文檔,這類(lèi)文檔會(huì )有許多不同的實(shí)例(參見(jiàn)圖 2)。這類(lèi)似于現在面向對象系統中類(lèi)和對象之間的關(guān)系。類(lèi)相對于架構,對象相對于 XML 文檔。因此,在使用 XML 架構時(shí),您通常要使用不止一個(gè)文檔,還有架構以及一個(gè)或多個(gè) XML 實(shí)例文檔。
圖 2 命名空間標識符鏈接
架構定義中使用的元素來(lái)自 http://www.w3.org/2001/XMLSchema 命名空間,在本專(zhuān)欄的以下部分,我會(huì )將其綁定到 xsd。以下為基本的架構模板:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://example.org/employee/"><!-- definitions go here --></xsd:schema>
架構定義必須具有一個(gè)根 xsd:schema元素。各種元素都可能嵌套在 xsd:schema 中,包括但不限于 xsd:element、xsd:attribute 和 xsd:complexType,所有這些我都會(huì )進(jìn)行討論。
架構定義是一個(gè) XML 文檔這一事實(shí)解決了 DTD 的首要限制。您可以使用標準的 XML 1.0 工具和服務(wù)(如 DOM、SAX、Xpath 和 XSLT)來(lái)處理架構定義文檔。這樣做所固有的簡(jiǎn)單性對各種架構工具造成了沖擊。
XML 架構和命名空間
置于 xsd:schema 元素中的定義會(huì )自動(dòng)與 targetNamespace 屬性中指定的命名空間相關(guān)聯(lián)。在前面的示例情況下,架構定義將與 http://example.org/employee/ 命名空間相關(guān)聯(lián)。
命名空間標識符是聯(lián)系 XML 文檔和對應的架構定義的關(guān)鍵(參見(jiàn) 圖 2 )。例如,以下 XML 實(shí)例文檔包含了位于 http://example.org/employee/ 命名空間的 employee 元素:
<tns:employee xmlns:tns="http://example.org/employee/"/>
該 employee 元素的命名空間與架構定義中的 targetNamespace 相同。
為了在處理 employee 元素時(shí)利用該架構,處理器需要找到正確的架構定義。架構處理器如何為一個(gè)特定的命名空間找到架構定義在規范中沒(méi)有進(jìn)行定義。然而,大多數處理器會(huì )允許您加載一個(gè)架構的內存緩存,它會(huì )在處理文檔時(shí)使用。例如,以下基于 JScript? 的代碼展示了一種使用 MSXML 4.0 實(shí)現這個(gè)功能的簡(jiǎn)單方法:
var sc = new ActiveXObject("MSXML2.XMLSchemaCache.4.0);sc.add("http://example.org/employee/", "employee.xsd");var dom = new ActiveXObject("MSXML2.DOMDocument.4.0");dom.schemas = sc;if (dom.load("employee.xml"))WScript.echo("success: document conforms to Schema");elseWScript.echo("error: invalid instance");
它在 Microsoft? .NET 和大多數其他可識別 XML 架構的處理器中的運行方式都是類(lèi)似的。
您可以從本文頂部的鏈接下載一個(gè)命令行驗證實(shí)用工具,以試驗本專(zhuān)欄中討論的原理。該驗證實(shí)用工具允許您指定想驗證的實(shí)例文檔以及所需要的任意多的架構定義。命令行用法如下:
c:>validate instance.xml -s schema1.xsd -s schema2.xsd ...
XML架構還提供了 schemaLocation 屬性,用于在實(shí)例文檔中提供關(guān)于所需架構定義位置的提示。schemaLocation 屬性位于http://www.w3.org/2001/XMLSchema-instance 命名空間中,該命名空間是專(zhuān)門(mén)為只在實(shí)例文檔中使用的屬性而保留的。從現在起,我會(huì )將這個(gè)命名空間綁定到 xsi 前綴。xsi:schemaLocation 屬性采用一個(gè)以空格為分隔符的命名空間標識符和 URL 對的列表,如下所示:
<tns:employee xmlns:tns="http://example.org/employee/"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://example.org/employee/http://develop.com/aarons/employee.xsd"/>
在這種情況下,如果處理器還沒(méi)有訪(fǎng)問(wèn)到適合于http://example.org/employee/ 命名空間的架構定義,則可以從http://develop.com/aarons/employee.xsd 下載。
元素和屬性
使用 xsd:element 和 xsd:attribute 元素,可以分別將元素和屬性定義為 targetNamespace 的一部分。例如,假定您要描述以下可識別命名空間的實(shí)例文檔:
<tns:employee xmlns:tns="http://example.org/employee/"tns:id="555-12-3434"><tns:name>Monica</tns:name><tns:hiredate>1997-12-02</tns:hiredate><tns:salary>42000.00</tns:salary></tns:employee>
完成該操作最簡(jiǎn)單的方法是通過(guò)以下架構定義:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://example.org/employee/"><xsd:element name="employee"/><xsd:element name="name"/><xsd:element name="hiredate"/><xsd:element name="salary"/><xsd:attribute name="id"/></xsd:schema>
請注意,僅在 xsd:schema 元素中放置 xsd:element/xsd:attribute 聲明,會(huì )自動(dòng)將其與 http://example.org/employee/ 命名空間相關(guān)聯(lián)。由于這些聲明是根 xsd:schema 元素的子級,它們在架構中被認為是全局的。
由于該架構把這些元素/屬性指定為 http://example.org/employee/ 命名空間的組成部分,它們在實(shí)例文檔中必須與該命名空間相關(guān)聯(lián)(就像我在前面 列出的原始實(shí)例一樣)。對實(shí)例進(jìn)行細微的命名空間更改將導致它無(wú)效。例如,您應考慮以下包含不合格的 name、hiredate 和 salary 元素以及不合格 id 屬性 的文檔:
<tns:employee xmlns:tns="http://example.org/employee/"id="555-12-3434"><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></tns:employee>
因為前面的架構定義說(shuō)明這些元素/屬性均來(lái)自 http://example.org/employee/ 命名空間,而這次它們未與命名空間相關(guān)聯(lián),所以根據架構這個(gè)實(shí)例無(wú)效。
即使是一個(gè)細微的更改也會(huì )修改原始文檔,所以它使用默認的命名空間聲明,而不是一個(gè)命名空間前綴:
<employee xmlns="http://example.org/employee/"id="555-12-3434"><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></employee>
雖然在此情況下,所有的元素都與默認命名空間 (http://example.org/employee/) 關(guān)聯(lián),但 id 屬性仍然是不合格的,因為默認命名空間不適用于屬性。因此,根據架構,這個(gè)文檔實(shí)例也被認為是無(wú)效的。
如您所見(jiàn),XML 命名空間恰恰是 XML 架構的核心。在使用 XML 架構時(shí),必須全面了解命名空間是如何工作的,因為如果實(shí)例文檔與架構指定的不一致,則它會(huì )無(wú)效。
您可能已經(jīng)注意到這個(gè)簡(jiǎn)單示例既沒(méi)有限制任何元素的內容,也未定義命名空間中各元素之間的結構關(guān)系。它等效于以下 DTD(暫時(shí)省略了屬性聲明):
<!ELEMENT employee ANY><!ELEMENT name ANY><!ELEMENT hiredate ANY><!ELEMENT salary ANY>
因此,即使以下 XML 實(shí)例文檔沒(méi)有任何意義,根據架構,該文檔也是有效的:
<tns:name xmlns:tns="http://example.org/employee/"><tns:employee><tns:hiredate>42.000</hiredate><tns:salary tns:id="555-12-3434">Monica</tns:salary></tns:employee></tns:name>
XML 架構使通過(guò)復雜類(lèi)型定義描述元素的結構成為可能。
定義復雜類(lèi)型
使用 DTD,一個(gè)元素的內容模型在 ELEMENT 聲明中定義,如下所示:
<!ELEMENT employee (name, hiredate, salary)>
該 ELEMENT 聲明表明一個(gè) employee 元素包含一個(gè) name 元素,然后是一個(gè) hiredate 元素,最后是一個(gè) salary 元素。
XML 架構能夠用在 xsd:element 聲明中嵌套 xsd:complexType 元素的類(lèi)似方式來(lái)定義元素內容模型,如下所示:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://example.org/employee/"><xsd:element name="employee"><xsd:complexType><!-- employee‘s content model goes here --></xsd:complexType></xsd:element></xsd:schema>
XML 架構模型更像一門(mén)編程語(yǔ)言,在其中,您可以將變量綁定到正式類(lèi)型定義。xsd:complexType 允許您定義一個(gè)傳遞其結構的元素類(lèi)型。在元素聲明中嵌套 xsd:complexType 會(huì )有效地將其綁定到那個(gè)元素(類(lèi)似一個(gè)變量)。從類(lèi)型定義方面進(jìn)行思考是從 DTD 工作方式的一個(gè)主要的形式轉變。
您放入 xsd:complexType 元素中的內容與您放入DTD ELEMENT 聲明括號中的內容是類(lèi)似的。前面的 employee ELEMENT 聲明指定了 name、hiredate 和 salary 元素的順序。使用管道 (|) 分隔符而不是逗號改變了一個(gè)元素選擇的意義:
<!ELEMENT employee (name | hiredate | salary)>
在 XML 架構中,您通過(guò)一個(gè)排序元素指定內容模型的特征,它被作為 xsd:complexType 元素的子級進(jìn)行嵌套。XML 架構定義了三個(gè)排序元素: xsd:sequence、xsd:choice 和 xsd:all (如圖 3 所示)。
xsd:sequence 和 xsd:choice 元素等效于上述所示的 DTD 示例。然而,xsd:all 是一個(gè)新概念 — 它指定內容模型由以任何順序排列的所有項組成。 DTD 語(yǔ)法中沒(méi)有設計這種概念,但是您可以像下面所示的那樣通過(guò)顯式地指定所有可能的排列來(lái)定義此類(lèi)語(yǔ)義:
<!ELEMENT employee ( (name, hiredate, salary) |(name, salary, hiredate) |(hiredate, name, salary) |(hiredate, salary, name) |(salary, name, hiredate) |(salary, hiredate, name) ) >
如您所見(jiàn),組合數學(xué)很快開(kāi)始對您造成不利了。由于 "all" 像排列和組合一樣,是一個(gè)一級排序,所以XML 架構方法更為簡(jiǎn)潔。
排序元素可以包含對全局元素聲明、局部元素聲明、其他排序以及一些其他諸如通配符和組引用等構造的引用。圖 4 所示的架構示例說(shuō)明了如何定義一個(gè)對在架構其他地方定義的全局元素進(jìn)行引用的 xsd:complexType。
請注意,ref 屬性采用了一個(gè)帶有前綴的元素名稱(chēng)。切記,一旦在架構中聲明了一個(gè)全局元素,它就會(huì )自動(dòng)地與 targetNamespace 相關(guān)聯(lián)。當您按 name 引用全局元素時(shí),它們將被看作合格的 name。如果使用 ref="name" 而不是 ref="tns:name",架構處理器則會(huì )尋找未與命名空間相關(guān)聯(lián)(或默認命名空間,如果有一個(gè)已在使用)的 name 元素,但是不會(huì )找到,因為在架構中聲明的唯一 name 元素是來(lái)自 http://example.org/employee/ 命名空間的 name 元素。
如果我已經(jīng)把 http://example.org/employee/ 作為文檔的默認命名空間,我就能夠在不使用命名空間前綴(例如,ref="name")的情況下引用全局元素名稱(chēng)了,如圖 5 所示。
圖 4圖 5 中的示例架構在邏輯上是等效的 — 它們只是以稍微不同方式進(jìn)行了序列化。兩個(gè)示例架構都對 employee 元素的內容進(jìn)行了限制?,F在,employee 元素必須包含 name、hiredate 和 salary 元素,并且所有這些元素都必須與 http://example.org/employee/ 命名空間相關(guān)聯(lián)。
局部元素聲明
由于 employee 是我計劃在實(shí)例文檔中作為頂層元素使用的唯一元素,因此實(shí)在沒(méi)有理由將 name、hiredate 和 salary 定義為全局元素。相反,我僅僅能夠在 employee 元素的內容模型中局部定義 name、hiredate 和 salary 元素。
例如,圖 6中顯示的架構包含了一個(gè) employee 元素聲明,聲明中包含了一個(gè)局部元素聲明的序列。在這個(gè)示例中,name、hiredate 和 salary 元素實(shí)際上作為 employee 元素的一部分進(jìn)行聲明,而且不能在實(shí)例的其他位置使用。只有 employee 元素聲明作為根 xsd:schema 元素的一個(gè)子級全局出現。這就提出了一個(gè)有趣的問(wèn)題:局部元素應該與目標命名空間相關(guān)聯(lián)嗎?
局部范圍和命名空間
為了有助于理解該問(wèn)題的答案,讓我們以支持命名空間的編程語(yǔ)言(如 C#)編寫(xiě)的類(lèi)似示例為例。請仔細查看以下在 "example" 命名空間中定義的C# 類(lèi)定義:
namespace example {public class employee {public string name;public string hiredate;public double salary;}}
在該命名空間中,什么標識符是真正可見(jiàn)的?只有一個(gè) — employee。name、hiredate 和 salary 標識符只是在 employee 類(lèi)中可見(jiàn)。因此,您需要用命名空間標識符而不是局部成員名稱(chēng)來(lái)限定 employee,如下所示:
// employee is namespace-qualifiedexample.employee c = new example.employee();// local members are unqualifiedc.name = "Monica";c.hiredate = "1997-12-02";c.salary = 42000.00;// this does not work, nor make sense// c.example.name = "Monica";
XML 架構設計者好象在沿著(zhù)局部范圍的思路進(jìn)行思考,因為在默認模式下它是以這種同樣的方式工作的。在 XML 架構中,實(shí)例文檔中只有全局元素需要用目標命名空間限定,而且局部元素必須保持為非限定的。下面顯示的 XML 文檔是圖 6所示的完整架構的一個(gè)有效實(shí)例:
<!-- global element qualified --><tns:employee xmlns:tns="http://example.org/employee/"><!-- local elements unqualified --><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></tns:employee>
如果修改該實(shí)例以便 name、hiredate和 salary 元素均由 http://example.org/employee/ 命名空間限定,根據架構,它會(huì )變得無(wú)效。切記,即使是對默認命名空間聲明進(jìn)行細微的改變也會(huì )導致該結果的發(fā)生。
由于不是每個(gè)人都滿(mǎn)意該方法,XML 架構設計者使在實(shí)例中控制對局部元素應該進(jìn)行限定還是取消限定成為可能。您可以在元素/元素基礎上通過(guò)窗體屬性對此進(jìn)行控制,如下所示:
<xsd:element name="employee"><xsd:complexType><xsd:sequence><!-- local element declarations --><xsd:element name="name" form="qualified"/><xsd:element name="hiredate"/><xsd:element name="salary" form="qualified"/></xsd:sequence></xsd:complexType></xsd:element>
employee元素的一個(gè)有效實(shí)例現在將具有一個(gè)限定的子級 name 元素和一個(gè)非限定的子級 hiredate 元素,在其后是一個(gè)限定的子級 salary 元素,如該有效實(shí)例所示:
<tns:employee xmlns:tns="http://example.org/employee/"><tns:name>Monica</tns:name><hiredate>1997-12-02</hiredate><tns:salary>42000.00</tns:salary></tns:employee>
您還可以通過(guò) elementFormDefault 屬性切換架構中所有局部元素聲明的默認設置,如下所示:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://example.org/employee/"elementFormDefault="qualified">•••</xsd:schema>
現在,在默認情況下,所有局部元素都必須在實(shí)例中進(jìn)行限定(假定還沒(méi)有使用窗體屬性重寫(xiě)特定元素的設置),如該有效實(shí)例所示:
<tns:employee xmlns:tns="http://example.org/employee/"><tns:name>Monica</tns:name><tns:hiredate>1997-12-02</tns:hiredate><tns:salary>42000.00</tns:salary></tns:employee>
由于所有元素在這種情況下都是合格的,用戶(hù)現在可以選用一個(gè)默認的命名空間聲明和仍將有效的實(shí)例:
<employee xmlns="http://example.org/employee/"><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></employee>
出現約束
在 DTD 中,您可以通過(guò) *、+ 和 ? 修飾符控制內容模型中元素出現的次數。XML 架構擺脫了這些修飾符并僅定義了兩個(gè)屬性,minOccurs 和 maxOccurs,它們可以在元素聲明、排序和一些其他架構構造中使用。
一個(gè)項必須出現的最小次數和它能出現的最大次數分別由 minOccurs 和 maxOccurs 指定。兩個(gè)屬性的默認值都是 1。您還可以使用 maxOccurs 中 的 "unbounded" 值來(lái)指定可以接受的無(wú)限次出現數。
考慮以下 DTD ELEMENT 聲明:
<!ELEMENT employee ( (fname, (middle | mi)?, lname, lname?),(project, role)* )>
可以使用一些嵌套的排序和 minOccurs/maxOccurs 在 XML 架構中對 ELEMENT 聲明進(jìn)行重寫(xiě),如圖 7所示。
復雜類(lèi)型和屬性
使用 DTD 時(shí),屬性是為一個(gè)特定的元素定義的。下面的 ATTLIST 聲明將 id 屬性和 employee 元素相關(guān)聯(lián):
<!ELEMENT employee (name, hiredate, salary)><!ATTLIST employee id CDATA #REQUIRED>
在 DTD 中定義全局屬性是不可能的。它們始終必須同一個(gè)特定元素相關(guān)聯(lián),如上所示。
XML 架構使得屬性可以像元素那樣進(jìn)行全局和局部定義。全局屬性是通過(guò)在根 xsd:schema 元素中使用 xsd:attribute 元素定義的。所示的第一個(gè)架構示例定義了一個(gè)命名為 id 的全局屬性。全局屬性是指您在各種情況下都不能預見(jiàn)它們會(huì )在何處使用。
屬性也能夠包含在一個(gè) xsd:complexType 定義中,使它們對于該特定類(lèi)型而言是局部的。在 xsd:complexType 元素中使用時(shí),xsd:attribute 元素必須在子級排序之后,如下面全局元素聲明所示:
<xsd:element name="employee"><xsd:complexType><xsd:sequence><xsd:element name="name"/></xsd:sequence><xsd:attribute name="id"/></xsd:complexType></xsd:element>
對于元素,您必須限定全局屬性并且不能在實(shí)例文檔中通過(guò)默認方式限定局部屬性。以下是以前定義的 employee 元素的一個(gè)有效實(shí)例:
<tns:employee xmlns:tns="http://example.org/employee/"id=‘555-12-3434‘><name>Monica</name></tns:employee>
然而,對于元素,如果您希望限定局部屬性,可以通過(guò)窗體或 attributeFormDefault 屬性改變該行為。
已命名類(lèi)型和重用
到此為止,我一直在通過(guò) xsd:complexType 定義來(lái)定義元素的類(lèi)型(或結構)。然而,在和新聲明的元素聯(lián)系時(shí),這些類(lèi)型定義不會(huì )被命名。該方法類(lèi)似于在 C++ 中使用匿名類(lèi)型。例如,以下 C++ 代碼將 pt 變量映射到它前面的匿名結構:
struct {double x;double y;} pt;
使用匿名類(lèi)型明顯的負面影響在于您不能重用類(lèi)型定義。因此,大多數 C++ 開(kāi)發(fā)人員使用已命名類(lèi)型:
struct Point {double x;double y;};Point pt1;
XML 架構也支持已命名類(lèi)型,實(shí)際上因其有價(jià)值的重用潛力,所以才成為大多數開(kāi)發(fā)人員首選的方法。您不但能夠在單個(gè)架構中重用已命名類(lèi)型,而且還能夠通過(guò) xsd:include 和 xsd:import 元素在各架構間重用已命名類(lèi)型。
您通過(guò)名稱(chēng)屬性來(lái)命名 xsd:complexType。然后,能夠通過(guò)類(lèi)型屬性將元素聲明綁定到一個(gè)已命名類(lèi)型。以下架構闡釋了該元素綁定如何運行:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:tns="http://example.org/employee/"targetNamespace="http://example.org/employee/"><xsd:complexType name="EmployeeType"><xsd:sequence><xsd:element name="name"/><xsd:element name="hiredate"/><xsd:element name="salary"/></xsd:sequence></xsd:complexType><xsd:element name="employee" type="tns:EmployeeType"/></xsd:schema>
請注意,由于 xsd:complexType 定義現在是架構中的一個(gè)全局構造,它會(huì )被自動(dòng)地與 targetNamespace 相關(guān)聯(lián)。這意味著(zhù)您在引用類(lèi)型屬性中的 EmployeeType 時(shí),必須使用限定名稱(chēng)。您可回溯本文中顯示的所有示例架構,并將匿名 xsd:complexType 轉換至已命名類(lèi)型。在這兩種方法之間轉換很容易。
使用已命名類(lèi)型的另一個(gè)好處在于,如果您不需要,則不必在架構中實(shí)際使用全局元素聲明。相反,您可以通過(guò) xsi:type 屬性顯式地指定實(shí)例文檔中的元素類(lèi)型,該屬性也來(lái)自 http://www.w3.org/2001/XMLSchema-instance 命名空間。例如,您應考慮以下實(shí)例來(lái)完成該任務(wù):
<foo xsi:type="tns:EmployeeType"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:tns="http://example.org/employee/"><name>Monica</name><hiredate>1997-12-02</hiredate><salary>42000.00</salary></foo>
foo 元素在架構的任何位置都未被聲明,但我已經(jīng)顯式地指定了它的類(lèi)型,對于處理器這足以明了如何處理 foo 的內容。該方法類(lèi)似于大多數編程語(yǔ)言中的強制轉換。
介紹數據類(lèi)型
我已經(jīng)介紹了通過(guò) xsd:element、xsd:attribute和 xsd:complexType 定義描述文檔結構細節的主要內容。然而,現在為止,您所看到的架構還沒(méi)有描述 name、hiredate 和 salary 元素以及 id 屬性的特征。在這一點(diǎn)上,它們能夠合法地包含任何內容。name、hiredate 和 salary 元素以及 id 屬性應真正地包含文本并且每個(gè)使用特定的格式。
在 DTD 中,您可以通過(guò) #PCDATA 標記指定元素必須只包含文本:
<!ELEMENT name (#PCDATA)>
遺憾地是,您不能指定有關(guān)包含在元素中的文本格式的任何內容。
圖 8 XML 架構內置數據類(lèi)型
這就是XML 架構比 DTD 大有進(jìn)步的地方,特別是對于軟件開(kāi)發(fā)人員。XML 架構定義了一組內置數據類(lèi)型,可以用于約束純文本元素和屬性的內容(參見(jiàn) 圖 8 )。每個(gè)數據類(lèi)型具有一個(gè)顯式定義的值空間和一個(gè)顯式定義的詞法空間(或者也就是說(shuō),可能在 XML 文檔中使用的字符串格式)。例如,double 值 4200 能夠以各種詞法方式進(jìn)行表示(參見(jiàn) 圖 9)。關(guān)于給定的數據類(lèi)型的值和詞法空間更詳細的內容,請參閱 XML 架構規范第二部分(相關(guān) URL 可在“推薦閱讀”側面欄中找到)。
圖 9 詞法表示
因此,為了限制在元素或屬性中使用的文本,選擇具有合適值/詞法空間的數據類(lèi)型并在聲明類(lèi)型屬性中使用它即可,如以下代碼所示:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:tns="http://example.org/employee/"targetNamespace="http://example.org/employee/"><xsd:complexType name="EmployeeType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="hiredate" type="xsd:date"/><xsd:element name="salary" type="xsd:double"/></xsd:sequence><xsd:attribute name="id" type="xsd:string"/></xsd:complexType><xsd:element name="employee" type="tns:EmployeeType"/></xsd:schema>
當一個(gè)架構處理器驗證前一個(gè)架構的示例時(shí),它會(huì )確保每個(gè)元素/屬性中包含的文本符合其定義類(lèi)型的合法的詞法表示。
如您在 圖 8 中所見(jiàn),對于每種情況都有一個(gè)數據類(lèi)型。然而,您一定會(huì )遇到內置數據類(lèi)型不能精確滿(mǎn)足您的需要的情況。例如,在以前的架構定義中,id 屬性被定義為類(lèi)型字符串,但它實(shí)際需要采用社會(huì )保障號格式。XML 架構確實(shí)能夠實(shí)現在這些情況下定義自定義簡(jiǎn)單類(lèi)型,但我會(huì )將這個(gè)主題留給本專(zhuān)欄的第二部分。
我們所處的位置 XML 架構克服了 DTD 中所有的局限和缺點(diǎn)。XML 架構語(yǔ)法是 XML 1.0。XML 架構完全圍繞命名空間進(jìn)行設計。而且,更重要的是,XML 架構支持典型的編程語(yǔ)言數據類(lèi)型以及自定義的簡(jiǎn)單和復雜類(lèi)型。
盡管 W3C 最近才發(fā)布了最終的 XML 架構建議(2001 年 5 月),但在各種 XML 和 Web 服務(wù)相關(guān)的基礎結構中已經(jīng)存在了對于該規范的廣泛支持。該基礎結構依靠 XML 架構來(lái)自動(dòng)生成 XML 處理代碼、構建即時(shí)動(dòng)態(tài)代理/存根、在編輯器和其他工具中提供 IntelliSense? 以及通過(guò)架構驗證技術(shù)來(lái)簡(jiǎn)化錯誤處理。MSXML 4.0、SOAP Toolkit 2.0 和 .NET 都是使用 XML 架構可以完成的絕好示例。
本月的專(zhuān)欄只涉及了 XML 架構的基礎知識。我介紹了 DTD 提供的所有功能和另外一些內容。在該系列的第二部分,我將向您展示該語(yǔ)言的更高級功能。
要向 Aaron 提出問(wèn)題和意見(jiàn),請發(fā)送電子郵件至xmlfiles@microsoft.com。
Aaron Skonnard 是 DevelopMentor 的教師兼研究員。在那里,他開(kāi)發(fā)了關(guān)于 XML 和 Web 服務(wù)的課程。Aaron 與人合著(zhù)了《Essential XML Quick Reference》(Addison-Wesley, 2001) 和《Essential XML》(Addison-Wesley, 2000)。您可以通過(guò)以下網(wǎng)址與 Aaron 聯(lián)系:http://staff.develop.com/aarons。
摘自2002 年 4 月期MSDN Magazine。此雜志可以通過(guò)各地的報攤購買(mǎi),也可以在此訂閱。
轉到原英文頁(yè)面
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Web Services學(xué)習路線(xiàn)圖之XML學(xué)習篇-SOA-Java
XML和Excel
xml schema中的命名空間
WebServiceWSDL結構分析
經(jīng)典技術(shù)文章轉載:SOAP編碼討論 - 老徐的博客 - 博客園
XML 入門(mén)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久