XML Schema和DTD有什么区别?

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

任何指导将不胜感激。

从DTD和Schema的区别 将DTD转换为Schema文章:

DTD和XML Schema之间的关键区别在于,XML Schema使用基于XML的语法,而DTD具有由SGML DTD保留的唯一语法。 虽然DTD经常因为需要学习新的语法而受到批评,但是语法本身是非常简洁的。 对于XML Schema来说,情况正好相反,它们是冗长的,但是也使用了标签和XML,这样XML的作者就可以更轻松地findXML Schema的语法。

DTD的目标是保持与SGML的兼容性,以便可能要将SGML DTD转换为XML DTD的应用程序。 但是,为了与XML的目标之一保持一致,“XML标记的简洁性至关重要”,保持简短的语法没有实际的关注。

[…]

那么当我们转换一个DTD时,其他的一些差异可能会特别重要呢? 让我们来看看。

打字

DTD和XML Schema之间最显着的区别是能够在Schema中创build和使用数据types以及元素和属性声明。 事实上,这是一个非常重要的区别,XML模式推荐的一半专门用于数据分析和XML模式。 本书的第三部分“XML模式数据types”详细介绍了数据types。

[…]

发生约束

DTD和Schema显着不同的另一个领域是出现约束。 如果您回想一下第2章“架构结构”(或您自己的DTD工作)的例子,可以使用三个符号来限制元素的出现次数:*,+和?

[…]

枚举

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

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

[…]

但是如果我们想要size成为一个元素呢? 我们不能用DTD来做到这一点。 DTD不提供元素文本内容的枚举。 但是,由于Schema的数据types,当我们在前面的例子中声明了枚举时,我们实际上创build了一个名为size_valuessimpleType ,我们现在可以使用一个元素:

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

[…]

XML模式定义(XSD)和文档types定义(DTD)之间的差异包括:

  • XML模式是用XML编写的,而DTD是从SGML语法派生的。
  • XML模式为元素和属性定义数据types,而DTD不支持数据types。
  • XML模式支持命名空间,而DTD则不支持。
  • XML模式定义子元素的数量和顺序,而DTD则不定义。
  • XML模式可以使用XML DOM自行处理,但在DTD中不可行。
  • 使用XML模式的用户不需要学习新的语言,但使用DTD对于用户来说是困难的。
  • XML模式提供安全的数据通信,即发送者可以用接收者理解的方式描述数据,但是DTD数据可能会被接收者误解。
  • XML模式是可扩展的,而DTD是不可扩展的。

更新 :2015.08.26

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

另一方面:

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

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

一个不同之处在于,在DTD中,元素的内容模型完全由其名称决定,与文档中出现的位置无关。 所以,假设你想要有一个person元素的name子元素,它自己有子元素firstlast 。 然后,如果您想在同一个文档中为city元素创build一个name子元素,那么也需要firstlast子元素。 相比之下,XML Schema允许您在本地声明子元素types,因此在这种情况下,您可以分别为personcity声明子元素的name ,并在这些上下文中为其提供适当的内容模型。

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

对我来说,其他的差异大多是肤浅的。 数据types支持可以很容易地添加到DTD,语法只是语法。 (我首先发现了XML Schema语法可怕并且永远不想手工维护一个XML Schema,我不会说DTD或RELAX NG模式;如果我因为某种原因需要XML Schema,我通常会写一个RELAX NG,然后用trang转换。)

XSD和DTD的相似之处

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

XSD和DTD的区别

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

另外,尽pipeXSD稍微冗长,但是它的语法是XML的扩展,使得学习更加方便快捷。

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

构build模式的开发人员可以根据核心数据types和使用不同的运算符和修饰符来创build自定义数据types。

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> 

相似之处

DTD和Schema都执行相同的基本function:

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

区别:

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

  • 模式是用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> 

因为DTD作为模式语言的有用性受到限制,不支持名称空间,并且不支持数据types,所以DTD几乎不被使用。 另外,DTD的语法比较复杂,很难理解和维护。

当XML第一次出现时,我们被告知它将解决我们所有的问题:XML将是用户友好的,无限扩展的,避免强types,并且不需要任何编程技能。 我了解了DTD,并编写了自己的XMLparsing器。 15年后,我发现大多数XML不是用户友好的,并且不是很可扩展的(取决于它的用法)。 只要一些聪明的堵塞将XML连接到数据库,我就知道数据types几乎是不可避免的。 而且,你应该看到前一天我必须工作的XSLT(转换文件)。 如果这不是编程,我不知道是什么! 现在看到与XML数据或接口有关的各种问题并不罕见。 我喜欢XML,但它远离原来的利他起点。

简短的答案? 由于XSD允许您更加精确地定义XML结构,所以DTD已经被弃用,以支持XSD。

正如很多人之前提到的那样,XML Schema使用基于XML的语法,而DTD具有唯一的语法。 DTD不支持数据types,这很重要。

让我们看一个非常简单的例子,大学有多个学生,每个学生有两个元素“名”和“年”。 请注意,我在代码中使用了“// – >”来进行评论。

在这里输入图像描述

现在我将在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> 

DTD指示XML元素的语法

XML Schemas是Microsoft替代validationXML的DTD的替代品