<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-72  評(píng)論-63  文章-0  trackbacks-0
    XML?DTD是目前使用最廣泛的一種XML?模式,XML?Schema則已經(jīng)成為W3C的正式推薦標(biāo)準(zhǔn),并有替代XML?DTD的趨勢。那么,從技術(shù)角度看,XML?Schema與XML?DTD有那些區(qū)別,XML?Schema又有那些優(yōu)勢呢?
    引言?
    XML?DTD(XML的文檔類型定義)是近幾年來XML技術(shù)領(lǐng)域所使用的最廣泛的一種模式。但是,由于XML?DTD并不能完全滿足XML自動(dòng)化處理的要求,例如不能很好實(shí)現(xiàn)應(yīng)用程序不同模塊間的相互協(xié)調(diào),缺乏對(duì)文檔結(jié)構(gòu)、屬性、數(shù)據(jù)類型等約束的足夠描述等等,所以W3C于2001年5月正式推薦XML?Schema為XML?的標(biāo)準(zhǔn)模式。顯然,W3C希望以XML?Schema來作為XML模式描述語言的主流,并逐漸代替XML?DTD。那么XML?Schema與XML?DTD相比到底有哪些優(yōu)勢呢,XML?DTD是否真的會(huì)在XML的模式描述領(lǐng)域中逐漸消失呢?

    XML模式與XML格式?
    XML模式是指用來描述XML結(jié)構(gòu)、約束等因素的語言,例如XML?Schema、XML?DTD、XDR,SOX等等。XML格式則是XML文檔本身所具有的格式。本文以XML?Schema來代表W3C所推薦的XML?Schema模式標(biāo)準(zhǔn),而以"XML模式"來代表所有的XML模式描述語言。

    從模式的描述語言來說,XML?Schema和XML?DTD都屬于語法模式。與概念模式不同,語法模式在對(duì)同一事物描述時(shí),可以采用不同的語法,例如在對(duì)關(guān)系模式描述時(shí),無論是使用XML?Schema還是XML?DTD,都既可以用元素也可以用屬性來描述關(guān)系模式的列。

    模式必須以某種格式來表示,XML?Schema的格式與XML?DTD的格式有著非常明顯的區(qū)別,XML?Schema事實(shí)上也是XML的一種應(yīng)用,也就是說XML?Schema的格式與XML的格式是完全相同的,而作為SGML?DTD的一個(gè)子集,XML?DTD具有著與XML格式完全不同的格式。這種區(qū)別會(huì)給XML?Schema的使用帶來許多好處:?

    XML用戶在使用XML?Schema的時(shí)候,不需要為了理解XML?Schema而重新學(xué)習(xí),節(jié)省了時(shí)間;?
    由于XML?Schema本身也是一種XML,所以許多的XML編輯工具、API?開發(fā)包、XML語法分析器可以直接的應(yīng)用到XML?Schema,而不需要修改。?
    作為XML的一個(gè)應(yīng)用,XML?Schema理所當(dāng)然的繼承了XML的自描述性和可擴(kuò)展性,這使得XML?Schema?更具有可讀性和靈活性。?
    由于格式完全與XML一樣,XML?Schema除了可以像XML一樣處理外,也可以同它所描述的XML文檔以同樣的方式存儲(chǔ)在一起,方便管理。?
    XML?Schema與XML格式的一致性,使得以XML為數(shù)據(jù)交換的應(yīng)用系統(tǒng)之間,也可以方便的進(jìn)行模式交換。?
    XML有非常高的合法性要求,XML?DTD對(duì)XML的描述,往往也被用作驗(yàn)證XML合法性的一個(gè)基礎(chǔ),但是XML?DTD本身的合法性卻缺少較好的驗(yàn)證機(jī)制,必需獨(dú)立處理。XML?Schema則不同,它與XML有著同樣的合法性驗(yàn)證機(jī)制。?

    數(shù)據(jù)類型

    或許,對(duì)于許多開發(fā)人員來講,XML?Schema與XML?DTD相比的一個(gè)最顯著的特征,就是其對(duì)數(shù)據(jù)類型的支持了。這完全是因?yàn)閄ML?DTD提供的數(shù)據(jù)類型只有CDATA?、Enumerated、NMTOKEN?、NMTOKENS等十種內(nèi)置(built-in)數(shù)據(jù)類型。這樣少的數(shù)據(jù)類型通常無法滿足文檔的可理解性和數(shù)據(jù)交換的需要。XML?Schema則不同,它內(nèi)置了三十七種數(shù)據(jù)類型,如long,int,short,double等常用的數(shù)據(jù)類型,并通過將數(shù)據(jù)類型表示為由value?space、lexical?space和facet三部分組成的三元組而獲得更大的靈活性。但是,?XML?Schema數(shù)據(jù)類型的真正靈活性來自于其對(duì)用戶自定義類型的支持。XML?Schema提供兩種方式來實(shí)現(xiàn)數(shù)據(jù)類型的定義。

    1)簡單類型定義(simpleType),即在XML?Schema內(nèi)置的數(shù)據(jù)類型基礎(chǔ)上或其它由XML?Schema內(nèi)置的數(shù)據(jù)類型繼承或定義所得到的簡單的數(shù)據(jù)類型(simpleType)基礎(chǔ)上,通過restriction,list?或者?union方式定義新的數(shù)據(jù)類型。

    例如:
    源碼1?restriction方式的定義
    <simpleType?name='Sku'>
    <restriction?base='string'>
    <pattern?value='\d{3}-[A-Z]{2}'/>
    </restriction>
    </simpleType>
    ?


    源碼2?list方式的定義
    <simpleType?name='listOfDouble'>
    <list?itemType='double'/>
    </simpleType>
    ?


    源碼3?union方式的定義
    <xsd:attribute?name="size">
    ??<xsd:simpleType>
    ???<xsd:union>
    ????<xsd:simpleType>
    ?????<xsd:restriction?base="xsd:positiveInteger">
    ??????<xsd:minInclusive?value="1"/>
    ??????<xsd:maxInclusive?value="12"/>
    ?????</xsd:restriction>
    ????</xsd:simpleType>
    ????<xsd:simpleType>
    ?????<xsd:restriction?base="xsd:string">
    ??????<xsd:enumeration?value="month"/>
    ?????</xsd:restriction>
    ????</xsd:simpleType>
    ???</xsd:union>
    ??</xsd:simpleType>
    ?</xsd:attribute>
    ?


    2)?復(fù)合類型定義(complexType),該方法提供了一種功能強(qiáng)大的復(fù)雜數(shù)據(jù)類型定義機(jī)制,可以實(shí)現(xiàn)包括結(jié)構(gòu)描述在內(nèi)的復(fù)雜的數(shù)據(jù)類型。下面是一個(gè)以complexType定義實(shí)現(xiàn)關(guān)系模式中表結(jié)構(gòu)的例子,設(shè)有表T_C_Type(Psign,Count),其中Psign為CHAR數(shù)據(jù)類型,Count為NUMBER數(shù)據(jù)類型。則有:

    源碼4?complexType定義?
    <!--表結(jié)構(gòu)類型定義-->
    ?<complexType?name="T_C_Type">
    ??<sequence?minOccurs="0"?maxOccurs="unbounded">
    ???<element?name="Psign">
    ????<complexType>
    ?????<simpleContent>
    ??????<restriction?base="string">
    ???????<attribute?name="value"?type="string"/>
    ??????</restriction>
    ?????</simpleContent>
    ????</complexType>
    ???</element>
    ???<element?name="Count"?minOccurs="0">
    ????<complexType>
    ?????<complexContent>
    ??????<restriction?base="anyType">
    ???????<attribute?name="value"?type="int"?use="optional"/>
    ??????</restriction>
    ?????</complexContent>
    ????</complexType>
    ???</element>
    ??</sequence>
    ?</complexType>
    ?


    不僅如此,XML?Schema還允許元素的內(nèi)容取空值,這一點(diǎn)可以擴(kuò)大XML?Schema對(duì)數(shù)據(jù)情況的描述范圍,而XML?DTD則無能為力。例如:

    源碼5?XML?Schema?元素取空值的定義?<element?name='test'?nullable='true'/>
    ?


    元素順序的支持?
    XML?DTD與XML?Schema?都支持對(duì)子元素節(jié)點(diǎn)順序的描述,但XML?DTD沒有提供對(duì)于無序情況的描述,也就是如果以XML?DTD來描述元素的無順序出現(xiàn)情況,它必須采用窮舉元素各種可能出現(xiàn)的排列順序的方式來實(shí)現(xiàn),這種方法不僅繁瑣,有時(shí)甚至是不現(xiàn)實(shí)的。例如對(duì)于table的a,b子元素,如果希望它們以任意的順序出現(xiàn),用XML?DTD來描述:

    源碼6?a,b子元素任意順序出現(xiàn)的XML?DTD定義?
    <?xml?version="1.0"?encoding="UTF-8"?>
    <!ELEMENT?ENTER_NAME_OF_ROOT_ELEMENT_HERE?EMPTY>
    <!ELEMENT?table?((a,b)|(b,a))>
    <!ELEMENT?a??(#PCDATA)>
    <!ELEMENT?b?(#PCDATA)>

    ?


    XML?Schema提供了<all>標(biāo)記來描述這種情況:

    源碼7?a,b子元素任意順序出現(xiàn)的XML?Schema定義?
    <xsd:element?name="a"?type="xsd:string"/>
    ?<xsd:element?name="b"?type="xsd:string"/>
    ?<xsd:element?name="table">
    ??<xsd:complexType>
    ???<xsd:all>
    ????<xsd:element?ref="a"/>
    ????<xsd:element?ref="b"/>
    ???</xsd:all>
    ??</xsd:complexType>
    ?</xsd:element>
    ?


    可見,用XML?Schema來實(shí)現(xiàn)子元素的無序描述要簡單的多。

    命名空間?
    在XML中引入命名空間的目的是為了能夠在一個(gè)XML文檔中使用其它XML文檔中的一些具有通用性的定義(通常是一些元素或數(shù)據(jù)類型等的定義),并保證不產(chǎn)生語義上的沖突。XML?DTD并不能支持這一特性,這進(jìn)一步限制了XML?DTD的適用范圍。而XML?Schema則很好的滿足了這一點(diǎn)。

    并且,?XML?Schema還提供了include?和?import兩種引用命名空間的方法。下面的例子中XML?Schema文檔引用了其它兩個(gè)XML?Schema的定義,通過使用import實(shí)現(xiàn)了混合使用不同命名空間的目的。例子中還定義了不同命名空間中元素之間的keyref約束。

    源碼8?XML?Schema對(duì)命名空間的使用?
    schema?targetNamespace="http://202.117.84.144"
    xmlns:xs="http://202.117.84.144"
    xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:a="http://202.117.84.228/middlewareSqlServer2000sqlservertest20211784228"
    xmlns:b="http://202.117.84.228/middlewareOracle805ioracletest20211784144"?
    elementFormDefault="qualified">
    <import?namespace="http://202.117.84.228/middlewareSqlServer2000sqlservertest20211784228"?
    ?schemaLocation="F:\xml?schema\middlewareSqlServer2000sqlservertest20211784228.xsd"/>
    <import?namespace="http://202.117.84.228/middlewareOracle805ioracletest20211784144"
    ?schemaLocation="F:\xml?schema\middlewareOrcal805ioracletest20211784144.xsd"/>
    ?<annotation>
    ??<documentation?xml:lang="cn">
    ???schema?for?Middleware
    ???Copyright?2001?Zhou?Jingtao.?All?rights?reserved.
    ??</documentation>
    ?</annotation>
    ?<element?name="CombineDatabase">
    ??<complexType>
    ???<sequence>
    ????<element?name="CombinGlobeSchema">
    ?????<complexType>
    ??????<sequence>
    ???????<element?ref="a:H-Database"/>
    ???????<element?ref="b:H-Database"/>
    ??????</sequence>
    ?????</complexType>
    ?????<keyref?name="SqlServerTest_T_C_Psign"?refer="b:gz_jgxx_ID_pk">
    ??????<selector?xpath="a:H-Database/a:SqlServerTest/a:T_C/a:Count"/>
    ??????<field?xpath="@value"/>
    ?????</keyref>
    ????</element>
    ???</sequence>
    ??</complexType>
    ?</element>
    </schema>
    ?


    對(duì)于API的支持?
    在掌握和使用XML技術(shù)時(shí),DOM和SAX可能是技術(shù)人員最常使用到的XML?API。DOM和SAX只對(duì)XML實(shí)例文檔有效,雖然可以通過它們實(shí)現(xiàn)以XML?DTD來驗(yàn)證XML文檔,但是DOM和SAX卻沒有提供解析XML?DTD文檔內(nèi)容的功能,也就是說我們無法通過DOM或SAX來得到DTD中元素、屬性的聲明和約束的描述。但是在基于XML+DTD的數(shù)據(jù)交換過程中,一些應(yīng)用程序需要得到DTD本身的描述內(nèi)容和結(jié)構(gòu),以方便對(duì)XML文檔中數(shù)據(jù)的處理,例如在使用關(guān)系數(shù)據(jù)庫存儲(chǔ)XML?文檔的過程中就涉及到如何將XML?DTD映射為關(guān)系模式描述的問題。為了實(shí)現(xiàn)對(duì)XML?DTD的解讀,研究人員必須為XML?DTD開發(fā)新的接口或者專用工具,帶來了很大的不便。

    由于XML?Schema本身就是一個(gè)XML?文檔,所以我們可以通過使用DOM、SAX或JDOM等XML?API很容易的解析XML?Schema,這就實(shí)現(xiàn)了XML文檔與其描述模式處理方式的一致性,利于數(shù)據(jù)的傳輸和交換。

    更加清晰的屬性出現(xiàn)情況的限制、以及缺省值和枚舉?
    XML?DTD以關(guān)鍵字#IMPlIED、#FIXED和#REQUIRED來指定屬性是否出現(xiàn),并支持屬性缺省值的定義。XML?Schema則提供了更明確的標(biāo)記來實(shí)現(xiàn)清晰易懂的表示。XML?Schema廢棄了XML?DTD的#IMPlIED,不再支持屬性的隱含狀態(tài),而要求必須給出明確的狀態(tài),并以prohibited來表示屬性的禁用。對(duì)于缺省值的表達(dá)則更為直觀,用default來直接給出。

    源碼9?XML?DTD?、XML?Schema對(duì)屬性出現(xiàn)情況的限制?
    <!ATTLIST?TestDTD?testAr1?CDATA??#IMPLIED>
    <!ATTLIST?TestDTD?testAr2?CDATA??#REQUIRED>
    <!ATTLIST?TestDTD?testAr3?CDATA??#FIXED?"3">
    <!ATTLIST?TestDTD?testAr4?CDATA??"3">

    <xsd:attribute?name="TestAr1"?type="xsd:string"?use="optional"?default="3"/>
    <xsd:attribute?name="TestAr2"?type="xsd:string"?use="prohibited"/>
    <xsd:attribute?name="TestAr3"?type="xsd:string"?use="required"?fixed="3"/>
    ?


    對(duì)于XML?Schema在枚舉方面的改進(jìn),請(qǐng)參見參考資料中"XML?問題?#7?W3C?XML?Schema?與文檔類型定義?(DTD)?比較"一文(文獻(xiàn)9)。

    注釋?
    XML?DTD和XML?Schema都支持<!-注釋內(nèi)容-->這樣的注釋方法,但是XML?Schema提供了更靈活和有用的注釋方式:documentation和appinfo。它們提供了面向讀者和應(yīng)用的注釋。

    源碼10?XML?Schema的注釋
    <xsd:annotation>
    <xsd:documentation>面向用戶和應(yīng)用的注釋</xsd:documentation>
    <xsd:appinfo>
    //這是一段C語言代碼。
    #include?stdio.h
    void?main()
    {
    int?i,j;
    i?=1;
    j=i+1;
    }
    </xsd:appinfo>
    ?


    對(duì)數(shù)據(jù)庫的支持?
    目前如何將關(guān)系數(shù)據(jù)表示為XML數(shù)據(jù)和如何實(shí)現(xiàn)基于關(guān)系數(shù)據(jù)庫的XML數(shù)據(jù)存儲(chǔ)、查詢和更新已經(jīng)成為了研究的熱點(diǎn)。Deutsh,F(xiàn)lorescu[5],Kossman[5],Shanmugasundaram[6,7]和D?W?Lee[8]等人都在XML與關(guān)系數(shù)據(jù)的相互轉(zhuǎn)化問題方面作了較深入的研究。然而由于XML?Schema成為正式推薦標(biāo)準(zhǔn)的時(shí)間較晚,加之XML?DTD語法相對(duì)簡單,所以現(xiàn)在大部分的研究和應(yīng)用都是基于XML?DTD展開的。但是,XML?DTD在對(duì)關(guān)系數(shù)據(jù)的描述方面明顯存在著不足,例如XML?DTD有限的數(shù)據(jù)類型根本無法完成對(duì)關(guān)系數(shù)據(jù)數(shù)據(jù)類型的一一映射,也無法實(shí)現(xiàn)大部分的數(shù)據(jù)規(guī)則的描述。XML?Schema提供了更多的內(nèi)建數(shù)據(jù)類型,并支持用戶對(duì)數(shù)據(jù)類型的擴(kuò)展,基本上滿足了關(guān)系模式在數(shù)據(jù)描述上的需要,這一點(diǎn)可以作為XML?Schema比XML?DTD更適合描述關(guān)系數(shù)據(jù)的一個(gè)主要的原因。?

    一個(gè)結(jié)論?
    通過比較,可以看出,XML?Schema比XML?DTD具有更強(qiáng)的表現(xiàn)力,能夠更好的滿足不同領(lǐng)域應(yīng)用的需求。那么,是不是可以說XML?DTD會(huì)很快被XML?Schema替代并最終消失呢。從作者的觀點(diǎn)來看,XML?Schema雖然在大多數(shù)的應(yīng)用領(lǐng)域都有替代XML?DTD的趨勢,但是XML?DTD仍然有它的適用范圍,并不可能被XML?Schema完全替代:?

    XML?DTD是作為XML?標(biāo)準(zhǔn)的一部分發(fā)布的,W3C似乎并沒有準(zhǔn)備將其從XML標(biāo)準(zhǔn)中廢除掉,對(duì)于XML?DTD的支持還將持續(xù)。?
    目前大多數(shù)的面向XML應(yīng)用,都對(duì)XML?DTD做了很好的支持,XML?DTD的工具也相對(duì)較為成熟,一般情況下,這些應(yīng)用和工具并不會(huì)選擇以XML?Schema替換XML?DTD的方式對(duì)其升級(jí),更多的選擇應(yīng)該是二者都支持。當(dāng)然,對(duì)于那些對(duì)數(shù)據(jù)交換或者描述能力要求較高、XML?DTD已不能滿足功能需求的應(yīng)用來說,以XML?Schema來代替XML?DTD已經(jīng)成為一種必然趨勢。?
    當(dāng)前大多數(shù)與XML?模式相關(guān)的算法研究都是基于XML?DTD展開的,作為一種研究的延續(xù),并不會(huì)放棄XML?DTD的研究成果,但是,針對(duì)XML?Schema的研究將會(huì)成為一個(gè)新的熱點(diǎn)。?
    在一些相對(duì)要求簡單的處理環(huán)境中,XML?DTD仍然會(huì)占有它的一席之地。?
    同其他技術(shù)的發(fā)展一樣,由于新標(biāo)準(zhǔn)的出現(xiàn),XML?DTD的作用會(huì)逐漸減弱,但正如層次數(shù)據(jù)庫在今天仍然在使用一樣,?對(duì)XML?Schema是否會(huì)完全替代XML?DTD做一個(gè)結(jié)論似乎為時(shí)過早。?

    所以,作為一種強(qiáng)有力的標(biāo)準(zhǔn),XML?Schema作為XML模式的主流已經(jīng)成為一種趨勢;但作為一種最簡單的XML模式,XML?DTD也還將會(huì)在一段時(shí)間內(nèi)發(fā)揮它應(yīng)有的作用。

    posted on 2006-05-23 18:06 船長 閱讀(375) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE
    主站蜘蛛池模板: 久久九九免费高清视频| 24小时在线免费视频| 亚洲AV无码成人精品区在线观看| 久久99热精品免费观看牛牛| 国产成人精品亚洲日本在线| 亚洲国产婷婷综合在线精品| 91九色老熟女免费资源站| 成人午夜影视全部免费看| 亚洲精品中文字幕乱码| 亚洲国产精品成人久久蜜臀 | 亚洲人成网国产最新在线| 亚洲日韩国产一区二区三区| 亚洲成人免费在线观看| 国产精品视频全国免费观看 | 亚洲AV无码资源在线观看| 亚洲人精品午夜射精日韩| 无码人妻一区二区三区免费| 国产精品免费久久久久影院 | 蜜芽亚洲av无码一区二区三区| 亚洲精品无码国产| 日本黄页网站免费| 37pao成人国产永久免费视频| 十八禁的黄污污免费网站| 在线观看亚洲AV每日更新无码| 亚洲色大成网站www永久一区| 麻豆国产入口在线观看免费| 91精品国产免费久久国语麻豆| 四虎影视久久久免费观看| 亚洲大码熟女在线观看| 亚洲精品中文字幕麻豆| 国产亚洲无线码一区二区| 亚洲不卡AV影片在线播放| 女人18毛片免费观看| 久久精品免费一区二区| 日本高清高色视频免费| 亚洲免费无码在线| 产传媒61国产免费| 黄色网址大全免费| 色偷偷尼玛图亚洲综合| 亚洲а∨天堂久久精品9966 | 野花香在线视频免费观看大全|