XML模式和DTD之间的区别是什么?
我用谷歌搜索了这个问题,但我不清楚什么是XML模式和DTD(文档类型定义),以及为什么XML模式比DTD更强大XML模式和DTD之间的区别是什么?,xml,schema,dtd,Xml,Schema,Dtd,我用谷歌搜索了这个问题,但我不清楚什么是XML模式和DTD(文档类型定义),以及为什么XML模式比DTD更强大 任何指导都将不胜感激 DTD早于XML,因此它本身不是有效的XML。这可能是XSD发明的最大原因。来自文章的一节: DTD之间的关键区别 XML模式就是那个XML模式 利用基于XML的语法,而 DTD具有独特的语法 来自SGML DTD。虽然DTD是 经常因为这种需要而受到批评 要学习新语法,语法 它本身相当简洁。相反的是 对于XML模式为true,这是 冗长,但也使用标记和 XML,
任何指导都将不胜感激 DTD早于XML,因此它本身不是有效的XML。这可能是XSD发明的最大原因。来自文章的一节: DTD之间的关键区别 XML模式就是那个XML模式 利用基于XML的语法,而 DTD具有独特的语法 来自SGML DTD。虽然DTD是 经常因为这种需要而受到批评 要学习新语法,语法 它本身相当简洁。相反的是 对于XML模式为true,这是 冗长,但也使用标记和 XML,以便XML的作者能够找到 XML无模式的语法 吓人的 DTDs的目标是保持一个水平 与SGML的兼容性 可能希望 将SGML DTD转换为XML DTD。 然而,为了符合 XML的目标,“XML标记中的简洁性” 是最不重要的,“没有 真正关心的是保持语法 简短的 [……] 那么,在转换DTD时,还有哪些其他可能特别重要的差异呢?让我们看一下。 键入 DTD和XMLSchema之间最显著的区别在于能够在模式中创建和使用数据类型以及元素和属性声明。事实上,这是一个非常重要的区别,XMLSchema建议的一半用于数据类型和XMLSchema。我们将在本书的第三部分“XML模式数据类型”中详细介绍数据类型 [……] 发生约束 DTD和模式的另一个显著不同之处是出现约束。如果您还记得我们在第2章“模式结构”(或您自己使用DTD的工作)中前面的示例,那么您可以使用三个符号来限制元素的出现次数:*、+和 [……] 枚举数 假设我们有一个元素,我们希望能够为衬衫定义一个尺寸属性,允许用户选择尺寸:小、中或大。我们的DTD如下所示:
<!ELEMENT item (shirt)>
<!ELEMENT shirt (#PCDATA)>
<!ATTLIST shirt
size_value (small | medium | large)>
[……]
DTD非常不受欢迎,因为它作为模式语言的用处有限,不支持名称空间,也不支持数据类型。此外,DTD的语法相当复杂,难以理解和维护。一个区别是,在DTD中,元素的内容模型完全由其名称决定,与它在文档中出现的位置无关: 假设你想要
- 一个
元素人
- 具有名为
name
本身有子元素name
和first
李>last
<person>
<name>
<first></first>
<last></last>
</name>
</person>
如果同一文档中的city
元素也需要有子元素“name”,则DTD要求该“name”元素也必须有子元素first
和last
。尽管事实上,city.name
不要求孩子们必须是first
和last
相反,XMLSchema允许您在本地声明子元素类型;您可以分别为person
和city
声明name
子元素。从而在这些上下文中为他们提供适当的内容模型
另一个主要区别是对名称空间的支持。由于DTD是原始XML规范的一部分(并从SGML继承),它们根本不知道名称空间,因为XML名称空间是后来指定的。您可以将DTD与名称空间结合使用,但这需要一些变通,比如被迫在DTD中定义前缀并仅使用这些前缀,而不能使用任意前缀
对我来说,其他差异大多是肤浅的。数据类型支持可以很容易地添加到DTD中,语法就是语法。(举例来说,我觉得XML模式语法很糟糕,永远不想手工维护XML模式,我不会说DTD或RELAXNG模式;如果出于某种原因需要XML模式,我通常会编写RELAXNG模式并用
trang
转换它)DTD指示XML元素的语法
XML模式是Microsoft用于验证XML的DTD的替代方案。DTD只能有两种类型的数据,CDATA和PCDATA。但是在模式中,可以使用编程语言中使用的所有基本数据类型,并且可以灵活地定义自己的自定义数据类型
构建架构的开发人员可以基于核心数据类型并通过使用不同的运算符和修饰符创建自定义数据类型。XML架构定义(XSD)和文档类型定义(DTD)之间的区别包括:
- XML模式是用XML编写的,而DTD是从SGML语法派生的
- XML模式为元素和属性定义数据类型,而DTD不支持数据类型
- XML模式允许支持名称空间,而DTD不支持名称空间
- XML模式定义子元素的数量和顺序,而DTD不定义
- XML模式可以通过XML DOM自己操作,但在DTD的情况下是不可能的
- 使用XML模式用户不需要学习新的语言,但使用DTD对用户来说很困难
- XML模式提供了安全的数据通信,即发送方可以用接收方理解的方式描述数据,但在DTD的情况下,接收方可能会误解数据<
<person> <name> <first></first> <last></last> </name> </person>
<!ATTLIST contact type CDATA #IMPLIED> <!ELEMENT address1 ( #PCDATA)> <!ELEMENT city ( #PCDATA)> <!ELEMENT state ( #PCDATA)> <!ELEMENT zip ( #PCDATA)>
<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>
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike 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)>
<?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>
<?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 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>