XML Schema和DTD有什么区别?

时间:2009-10-09 14:39:04

标签: xml schema dtd

我已经搜索了这个问题,但我不清楚什么是XML模式和DTD(文档类型定义),以及为什么XML模式比DTD更强大。

任何指导都将受到高度赞赏。

12 个答案:

答案 0 :(得分:122)

来自Differences Between DTDs and Schema文章的Converting a DTD into a Schema部分:

  

DTD之间的关键区别   XML Schema就是XML Schema   利用基于XML的语法,而   DTD具有独特的语法   来自SGML DTD。虽然DTD是   经常因为这种需要而受到批评   学习一种新的语法,语法   本身很简洁。相反的是   对于XML Schema,它是真的   详细,但也使用标签和   XML,以便XML的作者找到   XML Schema的语法较少   吓人。

     

DTD的目标是保持一个水平   兼容SGML的   可能想要的应用程序   将SGML DTD转换为XML DTD。   但是,与其中一个保持一致   XML的目标,“XML标记的简洁性   是最不重要的,“没有   真正关心保持语法   简短。

     

[...]

     

那么当我们转换DTD时,其他一些差异可能尤为重要?我们来看看。

     

<强>输入

     

DTD和XML Schema之间最重要的区别是能够在Schema中结合元素和属性声明创建和使用数据类型。实际上,XML Schema Recommendation的一半用于数据类型化和XML Schema,这是一个非常重要的区别。我们将在本书的第三部分“XML Schema数据类型”中详细介绍数据类型。

     

[...]

     

发生限制

     

DTD和Schema显着不同的另一个领域是出现限制。如果您从我们之前的第2章“模式结构”(或您自己的DTD工作)中的示例中回忆起来,可以使用三个符号来限制元素的出现次数:*,+和?。

     

[...]

     

<强>枚举

     

所以,假设我们有一个元素,我们希望能够为衬衫定义尺寸属性,这允许用户选择尺寸:小,中或大。我们的DTD看起来像这样:

<!ELEMENT item (shirt)>
<!ELEMENT shirt (#PCDATA)>
<!ATTLIST shirt
    size_value (small | medium | large)>
     

[...]

     

但是如果我们想要size成为一个元素呢?我们不能用DTD做到这一点。 DTD不提供元素文本内容中的枚举。但是,由于使用Schema的数据类型,当我们在前面的示例中声明枚举时,我们实际创建了一个名为simpleType的{​​{1}},我们现在可以将其与元素一起使用:

size_values
     

[...]

答案 1 :(得分:83)

XML架构定义(XSD)和文档类型定义(DTD)之间的差异包括:

  • XML模式是用XML编写的,而DTD是从SGML语法派生的。
  • XML模式定义元素和属性的数据类型,而DTD不支持数据类型。
  • XML模式允许支持名称空间,而DTD则不支持。
  • XML模式定义子元素的数量和顺序,而DTD则不定义。
  • XML模式可以使用XML DOM自行操作,但在DTD的情况下是不可能的。
  • 使用XML模式用户无需学习新语言,但使用DTD很困难。
  • XML模式提供安全的数据通信,即发送方可以以接收方理解的方式描述数据,但如果DTD数据可能被接收方误解。
  • XML模式是可扩展的,而DTD是不可扩展的。

更新:2015.08.26

并非所有这些要点都是100%准确,但你得到了要点。

另一方面:

  • DTD允许您定义新的 ENTITY 值,以便在XML文件中使用。
  • DTD允许您将其本地扩展到单个XML文件。

答案 2 :(得分:17)

正如许多人之前提到的,XML Schema使用基于XML的语法,DTD具有独特的语法。 DTD不支持数据类型,这很重要。

让我们看一个非常简单的例子,其中大学有多个学生,每个学生都有两个元素&#34; name&#34;和&#34;年&#34;。请注意,我使用&#34; // - &gt; &#34;在我的代码中只是为了评论。

enter image description here

现在我将在DTD和XSD中编写此示例。

<强> DTD

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:complexType name ="uniType">                    //--> complex datatype uniType
 <xsd:sequence>
  <xsd:element ref="student" maxOccurs="unbounded"/> //--> has unbounded no.of students
 </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="stuType">                     //--> complex datatype stuType
 <xsd:sequence>
  <xsd:element ref="name"/>                          //--> has element name
  <xsd:element ref="year"/>                          //--> has element year
 </xsd:sequence>
</xsd:complexType>

<xsd:element name="university" type="uniType"/>       //--> university of type UniType 
<xsd:element name="student" type="stuType"/>          //--> student of type stuType
<xsd:element name="name" type="xsd:string"/>          //--> name of datatype string
<xsd:element name="year" type="xsd:integer"/>         //--> year of datatype integer
</xsd:schema>



<?xml version="1.0" encoding="UTF-8"?>
<university>
    <student>
        <name>
            John Niel          
        </name>
        <year>
            2000                      //--> only an Integer value is allowed
        </year>
    </student>
</university>

XML架构定义(XSD)

{{1}}

答案 3 :(得分:15)

DTD早于XML,因此不是有效的XML本身。这可能是XSD发明的最大原因。

答案 4 :(得分:8)

XSD和DTD之间的相似性

both specify elements, attributes, nesting, ordering, #occurences

XSD和DTD之间的差异

XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD 

此外,尽管XSD有点冗长,但它的语法是XML的扩展,方便快速学习。

答案 5 :(得分:7)

一个不同之处还在于,在DTD中,元素的内容模型完全由其名称决定,与文档中出现的位置无关。因此,假设您希望name元素的person子元素本身具有子元素firstlast。然后,如果您希望在同一文档中为name元素设置city子元素,则还需要包含子元素firstlast。相比之下,XML Schema允许您在本地声明子元素类型,因此在这种情况下,您可以分别为nameperson声明city子元素,为它们提供正确的内容模型在那些情况下。

另一个主要区别是对命名空间的支持。由于DTD是原始XML规范的一部分(并且继承自SGML),因此它们根本不是名称空间感知,因为稍后会指定XML名称空间。您可以将DTD与名称空间结合使用,但它需要一些扭曲,例如被迫在DTD中定义前缀并仅使用这些前缀,而不是能够使用任意前缀。

对我而言,其他差异大多是肤浅的。可以轻松地将数据类型支持添加到DTD,语法只是语法。 (我,其中一个,发现XML Schema语法很糟糕,永远不想手工维护XML Schema,我不会说DTD或RELAX NG模式;如果我出于某种原因需要XML Schema,我通常会写一个RELAX NG并将其转换为trang。)

答案 6 :(得分:6)

<强>相似性

DTD和模式都执行相同的基本功能:

  • 首先,他们都宣布了一个元素和属性的清单。
  • 其次,两者都描述了如何在XML中对这些元素进行分组,嵌套或使用。换句话说,他们声明了允许某人在您的工作流程中创建XML文件的规则,并且
  • 第三,DTD和模式都提供了限制或强制元素类型或格式的方法。例如,在DTD或Schema中,您可以强制将日期字段写为01/05/06或1/5/2006。

差异:

  • DTD对于文本密集型应用程序更好,而模式对于数据密集型工作流程有几个优点。

  • 模式是用XML编写的,因此遵循相同的规则,而DTD则用完全不同的语言编写。

<强>示例:

DTD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="employees" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:attribute name="generated" type="xsd:dateTime"/>
      </xsd:complexType>
</xsd:element>
<xsd:element name="employees">
      <xsd:annotation>
           <xsd:appinfo>
               <od:index index-name="PrimaryKey" index-key="Employeeid " primary="yes"
                unique="yes" clustered="no"/>
          <od:index index-name="Employeeid" index-key="Employeeid " primary="no" unique="no"
           clustered="no"/>
     </xsd:appinfo>
</xsd:annotation>
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element name="Elastname" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Etitle" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Ephone" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Eemail" minOccurs="0" od:jetType="text"
               od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
               <xsd:element name="Ephoto" minOccurs="0" od:jetType="text"
                od:sqlSType="nvarchar">
                    <xsd:simpleType>
                         <xsd:restriction base="xsd:string">
                              <xsd:maxLength value="50"/>
                         </xsd:restriction>
                    </xsd:simpleType>
               </xsd:element>
          </xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

XSD:

YourBaseAdapter adapter = new YourBaseAdapter(YourDataType1 data1, YourDatatype2 data2, ....)

答案 7 :(得分:4)

DTD只能有两种类型的数据,CDATA和PCDATA。但是在模式中,您可以使用编程语言中使用的所有原始数据类型,并且可以灵活地定义自己的自定义数据类型。

构建架构的开发人员可以根据核心数据类型以及使用不同的运算符和修饰符来创建自定义数据类型。

答案 8 :(得分:4)

XML DTD

DTD的目的是定义XML文档的结构。它使用合法元素列表定义结构:

<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>

XML Schema

XML Schema使架构作者能够指定元素数量的数据 是数字,或者更具体地说,是一个整数。在以下示例中,我使用了字符串:

<xs:element name="note">
<xs:complexType>
  <xs:sequence>
    <xs:element name="address1" type="xs:string"/>
    <xs:element name="city" type="xs:string"/>
    <xs:element name="state" type="xs:string"/>
    <xs:element name="zip" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

答案 9 :(得分:4)

当XML首次出现时,我们被告知它将解决我们所有的问题:XML将是用户友好的,无限可扩展的,避免强类型,并且不需要任何编程技能。我学习了DTD并编写了自己的XML解析器。 15年多后,我发现大多数XML不是用户友好的,也不是非常可扩展的(取决于它的用法)。一旦一些聪明的clogs将XML连接到数据库,我就知道数据类型几乎是不可避免的。而且,你应该看到我必须在前几天工作的XSLT(转换文件)。如果那不是编程,我不知道是什么!现在,看到与XML数据或接口相关的各种问题都很糟糕并不罕见。我喜欢XML,但它偏离了原始的无私的起点。

简短的回答? DTD已被弃用而不赞成XSD,因为XSD允许您更精确地定义XML结构。

答案 10 :(得分:2)

DTD几乎被弃用,因为它作为模式语言的用途有限,不支持命名空间,并且不支持数据类型。另外,DTD的语法非常复杂,难以理解和维护。

答案 11 :(得分:-7)

DTD表示XML元素的语法

XML Schema是Microsoft用于验证XML的替代DTD