我用Google搜索这个问题,但我并不清楚什么是XML架构和DTD(文档类型定义)明白,为什么XML模式是更强大的比DTD。
任何指导,将不胜感激。
我用Google搜索这个问题,但我并不清楚什么是XML架构和DTD(文档类型定义)明白,为什么XML模式是更强大的比DTD。
任何指导,将不胜感激。
从DTD和架构之间的差异的部分一个DTD转换为架构的文章:
DTD和XML模式之间的重要区别在于,XML架构利用基于XML的语法,而DTD中有从SGML的DTD举行了一个独特的语法。 虽然DTD中往往因为这样需要学习一种新的语法批评,语法本身是相当简洁。 相反的XML模式,这是冗长,而且使用的标签和XML,使XML的作者应该找到XML模式的语法那么吓人是真实的。
DTD中的目标是保持与SGML兼容的水平,可能需要SGML DTD转换成XML DTD的应用程序。 然而,与XML的一个目标一致,“简洁的XML标记是最小的重要性,”有是保持简单的语法没有真正的关注。
[...]
那么,什么是一些当我们转换一个DTD这可能是特别重要的其他方面的差异? 让我们来看看。
打字
DTD和XML模式之间最显著的差异是创建并结合元素使用的数据类型的模式和属性声明的能力。 事实上,它是XML模式建议的一半是专门用于数据类型定义和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不提供在元素的文本内容枚举。 然而,由于与架构,当我们宣布在前面的例子中列举的数据类型,我们实际上创建了一个simpleType
称为size_values
我们现在可以与元素的使用:<xs:element name="size" type="size_value">
[...]
XML模式定义(XSD)和文档类型定义(DTD)之间的差异包括:
更新 :2015年8月26日
并非所有这些要点都100%准确,但你得到的要点。
另一方面:
正如许多人以前提到的那样,XML模式利用基于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>
DTD早XML,因此是无效的XML本身。 这可能对XSD的发明的最大原因。
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
此外,虽然XSD是有点冗长其语法是XML的扩展,使得它便于快速学习。
一个区别也是在DTD中,元素的内容模型是完全由它的名字确定的,独立于它出现在文档中。 所以,说你想有一个name
你的子元素person
元素本身具有子元素first
和last
。 然后,如果你想有一个name
的子元素city
在同一文件中元素,这也需要有子元素first
和last
。 相比之下,XML Schema允许你在本地声明子元素的类型,所以在这种情况下,你可以声明name
为子元素person
与city
分开,使他们在这些上下文中其应有的内容模型。
另一个主要区别是名称空间的支持。 由于DTD是最初的XML规范的一部分(从SGML继承),他们没有命名空间感知的,因为在所有XML命名空间,后来规定。 您可以与命名空间结合使用DTD,但它需要一些扭曲,就像被强行定义DTD中的前缀,并只使用前缀,而不是能够使用任意前缀。
对我来说,其他方面的差异大多是肤浅的。 数据类型的支持可以很容易地加入到DTD和语法只是语法。 (我来说,找到XML Schema语法可怕的,绝不会希望手工维护一个XML Schema,我不会说有关DTD的或RELAX NG模式;如果我需要某种原因,一个XML Schema,我平时写一个RELAX NG一个与它转换trang
)。
相似点 :
DTD和模式都执行相同的基本功能:
区别:
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>
DTD只能有两种类型的数据,在CDATA与PCDATA。 但是,在一个模式,你可以使用所有你在编程语言使用基本数据类型,你必须定义自己的自定义数据类型的灵活性。
开发者建立一个架构可以创建基于核心数据类型的自定义数据类型,并使用不同的运营商和改性剂。
XML DTD
一个DTD的目的是定义XML文档的结构。 它定义了合法的元素列表结构:
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
XML模式
XML模式使模式编写者指定元素数量的数据必须是数字,或者更具体地说,一个整数。 在下面的例子中,我使用的字符串:
<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>
当XML第一次出来的时候,我们被告知这将解决我们所有的问题:XML将是用户友好的,无限扩展,避免强类型,并且不需要任何编程技能。 我了解DTD的和写我自己的XML解析器。 15年后,我看到大部分XML是不是用户友好的,并没有很强的可扩展(根据用途)。 只要一些聪明的木屐迷上了XML的数据库中,我知道的数据类型都是不可避免的。 而且,你应该看到XSLT(转换文件),我不得不在一天的工作。 如果不是编程,我不知道是什么! 如今它的不寻常看到各种有关坏了XML数据或接口的问题。 我喜欢XML,但是,它已经从原来的利他主义的出发点,严重偏离。
简短的回答? DTD的有利于XSD年代被废弃,因为XSD,您可以定义更精确的XML结构。
DTD是非常反对,因为它是在它的有用性作为一种模式语言的限制,不支持命名空间,并且不支持的数据类型。 此外,DTD的语法相当复杂,因此很难理解和维护..
DTD表示XML元素的语法
XML架构是微软的DTD替代用于验证XML