新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → XML Schema 与 XML DTD的技术比较与分析 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 12301 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: XML Schema 与 XML DTD的技术比较与分析 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     anchen0617 帅哥哟,离线,有人找我吗?双子座1983-6-17
      
      
      威望:5
      等级:大二(研究C++)
      文章:281
      积分:3413
      门派:XML.ORG.CN
      注册:2004/10/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给anchen0617发送一个短消息 把anchen0617加入好友 查看anchen0617的个人资料 搜索anchen0617在『 DTD/XML Schema 』的所有贴子 访问anchen0617的主页 引用回复这个贴子 回复这个贴子 查看anchen0617的博客楼主
    发贴心情 XML Schema 与 XML DTD的技术比较与分析

    XML DTD是目前使用最广泛的一种XML 模式,XML Schema则已经成为W3C的正式推荐标准,并有替代XML DTD的趋势。那么,从技术角度看,XML Schema与XML DTD有那些区别,XML Schema又有那些优势呢?
    引言
    XML DTD(XML的文档类型定义)是近几年来XML技术领域所使用的最广泛的一种模式。但是,由于XML DTD并不能完全满足XML自动化处理的要求,例如不能很好实现应用程序不同模块间的相互协调,缺乏对文档结构、属性、数据类型等约束的足够描述等等,所以W3C于2001年5月正式推荐XML Schema为XML 的标准模式。显然,W3C希望以XML Schema来作为XML模式描述语言的主流,并逐渐代替XML DTD。那么XML Schema与XML DTD相比到底有哪些优势呢,XML DTD是否真的会在XML的模式描述领域中逐渐消失呢?

    XML模式与XML格式
    XML模式是指用来描述XML结构、约束等因素的语言,例如XML Schema、XML DTD、XDR,SOX等等。XML格式则是XML文档本身所具有的格式。本文以XML Schema来代表W3C所推荐的XML Schema模式标准,而以"XML模式"来代表所有的XML模式描述语言。

    从模式的描述语言来说,XML Schema和XML DTD都属于语法模式。与概念模式不同,语法模式在对同一事物描述时,可以采用不同的语法,例如在对关系模式描述时,无论是使用XML Schema还是XML DTD,都既可以用元素也可以用属性来描述关系模式的列。

    模式必须以某种格式来表示,XML Schema的格式与XML DTD的格式有着非常明显的区别,XML Schema事实上也是XML的一种应用,也就是说XML Schema的格式与XML的格式是完全相同的,而作为SGML DTD的一个子集,XML DTD具有着与XML格式完全不同的格式。这种区别会给XML Schema的使用带来许多好处:

    XML用户在使用XML Schema的时候,不需要为了理解XML Schema而重新学习,节省了时间;
    由于XML Schema本身也是一种XML,所以许多的XML编辑工具、API 开发包、XML语法分析器可以直接的应用到XML Schema,而不需要修改。
    作为XML的一个应用,XML Schema理所当然的继承了XML的自描述性和可扩展性,这使得XML Schema 更具有可读性和灵活性。
    由于格式完全与XML一样,XML Schema除了可以像XML一样处理外,也可以同它所描述的XML文档以同样的方式存储在一起,方便管理。
    XML Schema与XML格式的一致性,使得以XML为数据交换的应用系统之间,也可以方便的进行模式交换。
    XML有非常高的合法性要求,XML DTD对XML的描述,往往也被用作验证XML合法性的一个基础,但是XML DTD本身的合法性却缺少较好的验证机制,必需独立处理。XML Schema则不同,它与XML有着同样的合法性验证机制。

    数据类型

    或许,对于许多开发人员来讲,XML Schema与XML DTD相比的一个最显著的特征,就是其对数据类型的支持了。这完全是因为XML DTD提供的数据类型只有CDATA 、Enumerated、NMTOKEN 、NMTOKENS等十种内置(built-in)数据类型。这样少的数据类型通常无法满足文档的可理解性和数据交换的需要。XML Schema则不同,它内置了三十七种数据类型,如long,int,short,double等常用的数据类型,并通过将数据类型表示为由value space、lexical space和facet三部分组成的三元组而获得更大的灵活性。但是, XML Schema数据类型的真正灵活性来自于其对用户自定义类型的支持。XML Schema提供两种方式来实现数据类型的定义。

    1)简单类型定义(simpleType),即在XML Schema内置的数据类型基础上或其它由XML Schema内置的数据类型继承或定义所得到的简单的数据类型(simpleType)基础上,通过restriction,list 或者 union方式定义新的数据类型。

    例如:
    源码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) 复合类型定义(complexType),该方法提供了一种功能强大的复杂数据类型定义机制,可以实现包括结构描述在内的复杂的数据类型。下面是一个以complexType定义实现关系模式中表结构的例子,设有表T_C_Type(Psign,Count),其中Psign为CHAR数据类型,Count为NUMBER数据类型。则有:

    源码4 complexType定义
    <!--表结构类型定义-->
     <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还允许元素的内容取空值,这一点可以扩大XML Schema对数据情况的描述范围,而XML DTD则无能为力。例如:

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


    元素顺序的支持
    XML DTD与XML Schema 都支持对子元素节点顺序的描述,但XML DTD没有提供对于无序情况的描述,也就是如果以XML DTD来描述元素的无顺序出现情况,它必须采用穷举元素各种可能出现的排列顺序的方式来实现,这种方法不仅繁琐,有时甚至是不现实的。例如对于table的a,b子元素,如果希望它们以任意的顺序出现,用XML DTD来描述:

    源码6 a,b子元素任意顺序出现的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>标记来描述这种情况:

    源码7 a,b子元素任意顺序出现的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来实现子元素的无序描述要简单的多。

    命名空间
    在XML中引入命名空间的目的是为了能够在一个XML文档中使用其它XML文档中的一些具有通用性的定义(通常是一些元素或数据类型等的定义),并保证不产生语义上的冲突。XML DTD并不能支持这一特性,这进一步限制了XML DTD的适用范围。而XML Schema则很好的满足了这一点。

    并且, XML Schema还提供了include 和 import两种引用命名空间的方法。下面的例子中XML Schema文档引用了其它两个XML Schema的定义,通过使用import实现了混合使用不同命名空间的目的。例子中还定义了不同命名空间中元素之间的keyref约束。

    源码8 XML Schema对命名空间的使用
    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>


    对于API的支持
    在掌握和使用XML技术时,DOM和SAX可能是技术人员最常使用到的XML API。DOM和SAX只对XML实例文档有效,虽然可以通过它们实现以XML DTD来验证XML文档,但是DOM和SAX却没有提供解析XML DTD文档内容的功能,也就是说我们无法通过DOM或SAX来得到DTD中元素、属性的声明和约束的描述。但是在基于XML+DTD的数据交换过程中,一些应用程序需要得到DTD本身的描述内容和结构,以方便对XML文档中数据的处理,例如在使用关系数据库存储XML 文档的过程中就涉及到如何将XML DTD映射为关系模式描述的问题。为了实现对XML DTD的解读,研究人员必须为XML DTD开发新的接口或者专用工具,带来了很大的不便。

    由于XML Schema本身就是一个XML 文档,所以我们可以通过使用DOM、SAX或JDOM等XML API很容易的解析XML Schema,这就实现了XML文档与其描述模式处理方式的一致性,利于数据的传输和交换。

    更加清晰的属性出现情况的限制、以及缺省值和枚举
    XML DTD以关键字#IMPlIED、#FIXED和#REQUIRED来指定属性是否出现,并支持属性缺省值的定义。XML Schema则提供了更明确的标记来实现清晰易懂的表示。XML Schema废弃了XML DTD的#IMPlIED,不再支持属性的隐含状态,而要求必须给出明确的状态,并以prohibited来表示属性的禁用。对于缺省值的表达则更为直观,用default来直接给出。

    源码9 XML DTD 、XML Schema对属性出现情况的限制
    <!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"/>


    对于XML Schema在枚举方面的改进,请参见参考资料中"XML 问题 #7 W3C XML Schema 与文档类型定义 (DTD) 比较"一文(文献9)。

    注释
    XML DTD和XML Schema都支持<!-注释内容-->这样的注释方法,但是XML Schema提供了更灵活和有用的注释方式:documentation和appinfo。它们提供了面向读者和应用的注释。

    源码10 XML Schema的注释
    <xsd:annotation>
    <xsd:documentation>面向用户和应用的注释</xsd:documentation>
    <xsd:appinfo>
    //这是一段C语言代码。
    #include stdio.h
    void main()
    {
    int i,j;
    i =1;
    j=i+1;
    }
    </xsd:appinfo>


    对数据库的支持
    目前如何将关系数据表示为XML数据和如何实现基于关系数据库的XML数据存储、查询和更新已经成为了研究的热点。Deutsh,Florescu[5],Kossman[5],Shanmugasundaram[6,7]和D W Lee[8]等人都在XML与关系数据的相互转化问题方面作了较深入的研究。然而由于XML Schema成为正式推荐标准的时间较晚,加之XML DTD语法相对简单,所以现在大部分的研究和应用都是基于XML DTD展开的。但是,XML DTD在对关系数据的描述方面明显存在着不足,例如XML DTD有限的数据类型根本无法完成对关系数据数据类型的一一映射,也无法实现大部分的数据规则的描述。XML Schema提供了更多的内建数据类型,并支持用户对数据类型的扩展,基本上满足了关系模式在数据描述上的需要,这一点可以作为XML Schema比XML DTD更适合描述关系数据的一个主要的原因。

    一个结论
    通过比较,可以看出,XML Schema比XML DTD具有更强的表现力,能够更好的满足不同领域应用的需求。那么,是不是可以说XML DTD会很快被XML Schema替代并最终消失呢。从作者的观点来看,XML Schema虽然在大多数的应用领域都有替代XML DTD的趋势,但是XML DTD仍然有它的适用范围,并不可能被XML Schema完全替代:

    XML DTD是作为XML 标准的一部分发布的,W3C似乎并没有准备将其从XML标准中废除掉,对于XML DTD的支持还将持续。
    目前大多数的面向XML应用,都对XML DTD做了很好的支持,XML DTD的工具也相对较为成熟,一般情况下,这些应用和工具并不会选择以XML Schema替换XML DTD的方式对其升级,更多的选择应该是二者都支持。当然,对于那些对数据交换或者描述能力要求较高、XML DTD已不能满足功能需求的应用来说,以XML Schema来代替XML DTD已经成为一种必然趋势。
    当前大多数与XML 模式相关的算法研究都是基于XML DTD展开的,作为一种研究的延续,并不会放弃XML DTD的研究成果,但是,针对XML Schema的研究将会成为一个新的热点。
    在一些相对要求简单的处理环境中,XML DTD仍然会占有它的一席之地。
    同其他技术的发展一样,由于新标准的出现,XML DTD的作用会逐渐减弱,但正如层次数据库在今天仍然在使用一样, 对XML Schema是否会完全替代XML DTD做一个结论似乎为时过早。

    所以,作为一种强有力的标准,XML Schema作为XML模式的主流已经成为一种趋势;但作为一种最简单的XML模式,XML DTD也还将会在一段时间内发挥它应有的作用。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    xml这门语言太好了,我们共同努力吧!!!!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/4 18:36:00
     
     csgswtz 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:8
      积分:84
      门派:XML.ORG.CN
      注册:2004/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给csgswtz发送一个短消息 把csgswtz加入好友 查看csgswtz的个人资料 搜索csgswtz在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看csgswtz的博客2
    发贴心情 
    领教了 。。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/7 17:26:00
     
     anchen0617 帅哥哟,离线,有人找我吗?双子座1983-6-17
      
      
      威望:5
      等级:大二(研究C++)
      文章:281
      积分:3413
      门派:XML.ORG.CN
      注册:2004/10/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给anchen0617发送一个短消息 把anchen0617加入好友 查看anchen0617的个人资料 搜索anchen0617在『 DTD/XML Schema 』的所有贴子 访问anchen0617的主页 引用回复这个贴子 回复这个贴子 查看anchen0617的博客3
    发贴心情 
    谢谢

    ----------------------------------------------
    xml这门语言太好了,我们共同努力吧!!!!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/15 16:32:00
     
     jimmyvk 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(数据结构考了98分!)
      文章:66
      积分:400
      门派:XML.ORG.CN
      注册:2004/10/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给jimmyvk发送一个短消息 把jimmyvk加入好友 查看jimmyvk的个人资料 搜索jimmyvk在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看jimmyvk的博客4
    发贴心情 
    谢谢提供了参考,可否再多些两者对比的例子
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/17 9:30:00
     
     anchen0617 帅哥哟,离线,有人找我吗?双子座1983-6-17
      
      
      威望:5
      等级:大二(研究C++)
      文章:281
      积分:3413
      门派:XML.ORG.CN
      注册:2004/10/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给anchen0617发送一个短消息 把anchen0617加入好友 查看anchen0617的个人资料 搜索anchen0617在『 DTD/XML Schema 』的所有贴子 访问anchen0617的主页 引用回复这个贴子 回复这个贴子 查看anchen0617的博客5
    发贴心情 
    好的,我再找找看,行吧

    ----------------------------------------------
    xml这门语言太好了,我们共同努力吧!!!!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/18 18:43:00
     
     GoogleAdSense双子座1983-6-17
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/28 6:16:33

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    125.000ms