193

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

任何指导将不胜感激。

4

12 回答 12

149

从将DTD 转换为架构一文的DTD 与架构之间的差异部分:

DTD 和 XML Schema 之间的关键区别在于 XML Schema 使用基于 XML 的语法,而 DTD 具有从 SGML DTD 保留的独特语法。虽然 DTD 经常因为需要学习新的语法而受到批评,但语法本身非常简洁。XML Schema 则相反,它很冗长,但也使用标签和 XML,因此 XML 的作者应该发现 XML Schema 的语法不那么令人生畏。

DTD 的目标是为可能希望将 SGML DTD 转换为 XML DTD 的应用程序保留与 SGML 的兼容性级别。然而,为了与 XML 的目标之一保持一致,“XML 标记的简洁性是最不重要的”,并没有真正关心保持语法简洁。

[...]

那么,当我们转换 DTD 时,还有哪些可能特别重要的其他差异?让我们来看看。

打字

DTD 和 XML Schema 之间最显着的区别是在 Schema 中创建和使用数据类型以及元素和属性声明的能力。事实上,XML Schema Recommendation 的一半专门用于数据类型和 XML Schema,这是一个非常重要的区别。我们在本书的第三部分“XML Schema Datatypes”中详细介绍了数据类型。

[...]

出现约束

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

[...]

枚举

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

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

[...]

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

<xs:element name="size" type="size_value">

[...]

于 2009-10-09T15:01:37.877 回答
96

XML 模式定义 (XSD) 和文档类型定义 (DTD) 之间的区别包括:

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

并非所有这些要点都是 100% 准确的,但你明白了要点。

另一方面:

  • DTD 允许您定义新的ENTITY值以在 XML 文件中使用。
  • DTD 允许您将其本地扩展到单个 XML 文件。
于 2012-05-15T20:30:14.897 回答
33

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

让我们看一个非常简单的例子,其中大学有多个学生,每个学生有两个元素“姓名”和“年份”。请注意,我在我的代码中使用“// -->”只是为了评论。

在此处输入图像描述

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

DTD

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE university[              // --> university as root element 
<!ELEMENT university (student*)>   // --> university has  * = Multiple students
<!ELEMENT student (name,year)>     // --> Student has elements name and year
<!ELEMENT name (#PCDATA)>          // --> name as Parsed character data
<!ELEMENT year (#PCDATA)>          // --> year as Parsed character data
]>

<university>
    <student>
        <name>
            John Niel             //---> I can also use an Integer,not good
        </name>
        <year>
            2000                 //---> I can also use a string,not good
        </year>
    </student>
</university>

XML 架构定义 (XSD)

<?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>
于 2017-08-17T18:23:44.053 回答
18

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

于 2009-10-09T14:40:37.557 回答
10

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的扩展,便于快速学习。

于 2013-11-13T14:38:35.750 回答
9

一个区别是,在 DTD 中,元素的内容模型完全由其名称决定,与它在文档中出现的位置无关:

假设你想拥有

  • 一个person元素
  • 有一个名为的子元素name
  • anname本身有子元素firstlast.

像这样

   <person>
       <name>
            <first></first>
            <last></last>
       </name>
   </person>

如果city同一文档中的元素还需要有一个子元素“name”,则 DTD 要求这个“name”元素也必须有子first元素lastcity.name尽管不需要firstlast作为孩子的事实。

相反,XML Schema 允许您在本地声明子元素类型;您可以分别声明两者的子name元素。从而在这些上下文中为他们提供适当的内容模型。personcity

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

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

于 2009-10-10T18:35:28.983 回答
7

XML DTD

DTD的目的是定义 XML 文档的结构。它定义了具有法律元素列表的结构:

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

XML 模式

XML Schema使模式作者能够指定元素数量的数据必须是数字,或者更具体地说,是整数。在以下示例中,我使用了string

<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>

于 2013-11-11T17:19:55.183 回答
7

相似之处

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

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

差异:

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

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

例子:

DTD:

<?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT employees (Efirstname, Elastname, Etitle, Ephone, Eemail)>
         <!ELEMENT Efirstname (#PCDATA)>
         <!ELEMENT Elastname (#PCDATA)>
         <!ELEMENT Etitle (#PCDATA)>
         <!ELEMENT Ephone (#PCDATA)>
         <!ELEMENT Eemail (#PCDATA)>

XSD:

<?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>
于 2015-10-10T09:11:30.993 回答
4

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

构建模式的开发人员可以基于核心数据类型并使用不同的运算符和修饰符创建自定义数据类型。

于 2012-04-12T18:08:41.980 回答
4

当 XML 第一次问世时,我们被告知它将解决我们所有的问题:XML 将是用户友好的、无限可扩展的、避免强类型化并且不需要任何编程技能。我了解了 DTD 并编写了自己的 XML 解析器。15 年多以后,我发现大多数 XML 对用户不友好,而且可扩展性不强(取决于它的用法)。一旦一些聪明的木屐将 XML 连接到数据库,我就知道数据类型几乎是不可避免的。而且,您应该会看到我前几天必须工作的 XSLT(转换文件)。如果那不是编程,我不知道是什么!如今,与 XML 数据或接口相关的各种问题变坏的情况并不少见。我喜欢 XML,但是它偏离了最初的利他起点。

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

于 2015-09-08T12:31:05.053 回答
2

DTD 几乎被弃用了,因为它作为模式语言的用处有限,不支持命名空间,也不支持数据类型。此外,DTD 的语法相当复杂,难以理解和维护。

于 2009-10-09T18:19:20.850 回答
-7

DTD 表示 XML 元素的语法

XML Schemas 是 Microsoft 用于验证 XML 的 DTD 替代方案

于 2012-02-08T12:50:44.180 回答