DTD 或 XML 模式。哪一个更好? [关闭]

Posted

技术标签:

【中文标题】DTD 或 XML 模式。哪一个更好? [关闭]【英文标题】:DTD or XML Schema. Which one is better? [closed] 【发布时间】:2010-12-02 05:06:21 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

来自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。由于这可能是不切实际的,如果不是不可能的话,你经常不得不 满足于 schema-valid,这并不完全相同。

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

【讨论】:

您可以将 XSD 与 XML 内联。只需使用正确的命名空间,并将架构嵌套在文档中。 WSDL 文件通常这样做。 DTD 容易受到 DoS 攻击。见en.wikipedia.org/wiki/Billion_laughs @lavinio,我认为你对内联 XSD 是正确的;我之前看过文件这样做。关于 Billion Laughs 攻击的有趣文章。 有没有在 XSD 中无法实现的 DTD 功能?【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

是的! EditiX 提供了一种在 Relax NG 中编写并将其转换为 DTD 或 XSD 的方法。我支持Relax NG。 XSD 有时对我的一些初级工程师来说有点复杂。

以上是关于DTD 或 XML 模式。哪一个更好? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

具有不同属性的 xml dtd 或 xml 模式链接元素

未检测到文档的语法约束(DTD 或 XML 模式) (Android)

XML的验证模式DTD与XSD的区别

自定义 XML 文档的验证模式

当我使用 pipenv 安装 django 时,哪种方法更好? [关闭]

04_XML_04_XMLDTD语法