30

DTD 和 XML 模式的优缺点是什么(我什至不确定后者的正式名称是什么!)?哪个更好?为什么我们需要两种方法来做同样的事情?

编辑:我在我正在阅读的一篇文章中发现了这一点,这促使我提出这个问题:

为什么选择 W3C XML 模式语言?

W3C XML 模式语言不是唯一的模式语言。事实上,XML 规范将文档类型定义 (DTD) 描述为表达模式的方式。此外,JAXB 参考实现的预发布版本仅适用于 DTD——即,不适用于以 XML 模式语言编写的模式。然而,XML Schema Language 比 DTD 丰富得多。例如,用 XML 模式语言编写的模式可以描述在 DTD 中无法表达(或不容易表达)的结构关系和数据类型。有一些工具可用于将 DTD 转换为 W3C XML 模式语言,因此,如果您有与早期版本的 JAXB 参考实现一起使用的基于 DTD 的模式,http://java.sun.com/developer/technicalArticles/WebServices/jaxb/#binsch

我想我想要一些例子来说明为什么 XML-Schema 更好(如果确实如此的话)。

4

4 回答 4

21

来自http://weblogs.asp.net/rchartier/archive/2006/03/21/440782.aspx

  • DTD 不知道命名空间。

  • DTD 具有#define#include#ifdef-- 或者,较少面向 C 语言,能够定义速记缩写、外部内容和一些条件解析。

  • DTD 描述了整个 XML 文档(即使它留下了“漏洞”);模式可以定义部分。

  • XSD 有一个类型系统。

  • XSD 具有更丰富的语言来描述元素或属性内容的“外观”。这与类型系统有关。

  • 您可以将 DTD 内联到 XML 文档中,而 XSD 无法做到这一点。这意味着DTD 更安全(您只需保护一个字节流——xml/dtd——而不是
    多个)。

  • “有效 XML”的官方定义需要一个 DTD。由于这可能是不切实际的,如果不是不可能的话,您经常不得不满足于模式有效,这并不完全相同。

就我而言,如果您有 XSD,那么为某些 XML 编写验证器非常简单。虽然我确信它存在,但我还没有看到它与 DTD 一起使用。

于 2009-09-29T04:42:48.343 回答
10

几年前,有理由使用 DTD over XML Schema(XML 工具更常见或更好地支持它)。然而,今天,我认为没有理由不使用 XML Schema 来代替 DTD:XML Schema 更强大。

然而,XML Schema 远非完美(只需尝试阅读规范或有关 XML Schema 的书...),从那时起已经开发了许多替代方案(Schematron、Examplotron、RelaxNG)。与 XML Schema 相比,它们可能具有技术优势,但 XML Schema 在今天更加普遍,以至于我看到很少有替代方案有意义的情况。

于 2009-10-27T16:05:54.843 回答
5

XML Schema 可以执行更复杂的验证。例如,如果 DTD 可以检查 XML 元素的数据类型是整数还是字符串。而 XML 模式可以执行更复杂的验证,例如 xml 元素是否是以大写字母或正整数开头的字符串。最后,XML 模式使用 XML 语法,这是开发 Web 服务的自然选择。

于 2009-12-22T11:51:54.157 回答
4

还有 Relax NG — 另一种用于验证 XML 文档的强大语言,以及来自DSDL的 Schematron 和其他技术。Relax NG 非常简单并且具有人类可读的形式——Relax NG Compact,它允许编写类似于 BNF 方案的方案。

于 2009-09-29T05:28:05.310 回答