XML Schema和DTD有什么区别?


175

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

任何指导将不胜感激。

Answers:


135

从“ 将DTD转换为模式”一文中的“ DTD与模式之间区别”部分:

DTD和XML Schema之间的关键区别在于XML Schema使用基于XML的语法,而DTD具有从SGML DTD保留的唯一语法。尽管由于需要学习新语法而经常批评DTD,但语法本身非常简洁。对于XML Schema来说,情况恰恰相反,因为冗长,但也使用了标记和XML,因此XML的作者应该发现XML Schema的语法不太令人生畏。

对于可能要将SGML DTD转换为XML DTD的应用程序,DTD的目标是保持与SGML的兼容性。但是,为了符合XML的目标之一,“ XML标记中的简洁性至关重要”,对于语法的简短性并没有真正的担忧。

[...]

那么,在转换DTD时,其他一些特别重要的区别是什么?让我们来看看。

打字

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

[...]

发生约束

DTD和架构有很大不同的另一个领域是出现限制。如果您从第2章“架构结构”(或您自己的DTD使用)中的先前示例中回想起,可以使用三个符号来限制元素的出现次数:*,+和?。

[...]

枚举

因此,假设我们有一个元素,并且希望能够为衬衫定义一个size属性,该属性允许用户选择大小:小,中或大。我们的DTD如下所示:

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

[...]

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

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

[...]


1
仅需注意,W3C似乎认为DTD是XML模式语言的一种:“有几种不同的模式语言被广泛使用,但是主要的是文档类型定义(DTD),Relax-NG,Schematron和W3C XSD( XML模式定义)。“ w3.org/standards/xml/schema
Mordechai

1
@Mordechai我想他们将DTD指定为一种模式语言而不是XML模式。
kaartic '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.