DTD还是XML Schema,哪一个更好?

30

DTD和XML Schema(我甚至不确定后者的官方名称是什么)有哪些优缺点?哪一个更好?为什么我们需要两种方法来做同样的事情呢?

编辑:我在阅读一篇文章时发现了这篇文章,这也促使我提出了这个问题:

  

为什么需要W3C XML Schema语言?

  

W3C XML Schema语言并不是唯一的模式语言。实际上,XML规范描述了文档类型定义(DTDs)作为表达模式的方式。此外,JAXB参考实现的预发布版本仅使用DTDs,即不使用以XML Schema语言编写的模式。不过,XML Schema语言比DTDs更为丰富。例如,在XML Schema语言中编写的模式可以描述不能(或很难)在DTDs中表达的结构关系和数据类型。有一些工具可用于将DTD转换为W3C XML Schema语言,因此,如果您有基于DTD的模式并使用早期版本的JAXB参考实现,则可以使用这些工具将模式转换为XML Schema语言。http://java.sun.com/developer/technicalArticles/WebServices/jaxb/#binsch

我想要的是能说明XML Schema为什么更好(如果它确实更好)的例子。

4个回答

21
来自 http://weblogs.asp.net/rchartier/archive/2006/03/21/440782.aspx
  • DTD 不支持命名空间。

  • DTD 支持 #define,#include 和 #ifdef,或者更少地关注 C 的缩写定义、外部内容以及一些条件解析。

  • DTD 描述整个 XML 文档(即使它留下了“坑”);而 schema 可以定义部分内容。

  • XSD 具有类型系统。

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

  • 你可以将 DTD 内联到 XML 文档中,但你无法使用 XSD。这意味着 DTD 更安全(只需保护一个字节流 - xml/dtd - 因此不
    需要保护多个)。

  • “有效 XML”的官方定义需要一个 DTD。由于这可能是不切实际,甚至是不可能的,因此你通常需要满足 schema-valid,这并不完全相同。

对我来说,如果你有一个 XSD,那就很容易为某些 XML 编写验证器。我没有看到过 DTD 的验证器,尽管我相信它存在。


2
您可以将XSD与XML内联。只需使用正确的命名空间,并将模式嵌套在文档中即可。WSDL文件通常会这样做。DTD易受DoS攻击。请参见http://en.wikipedia.org/wiki/Billion_laughs - lavinio
@lavinio,我认为你关于内联XSD的想法是正确的;我之前也见过这样的文件。有关Billion Laughs攻击的文章很有趣。 - Robert Harvey
4
在XSD中是否有任何DTD特性无法实现? - dma_k

10

几年前,使用DTD而不是XML Schema有一些合理的原因(它更常见或被XML工具更好地支持)。但今天,我认为没有理由不使用XML Schema:XML Schema更加强大。

然而,XML Schema还远非完美(尝试阅读规范或关于XML Schema的书籍就知道了...),自那时以来已经开发出许多替代方案(Schematron、Examplotron、RelaxNG)。这些可能具有比XML Schema更好的技术优势,但是今天XML Schema如此普及,我认为很少有情况需要使用替代方案。


5

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


4

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


是的!EditiX 提供了一种编写 Relax NG 并将其转换为 DTD 或 XSD 的方式。我赞成使用 Relax NG。对于我的一些初级工程师来说,XSD 有时有点复杂。 - Scott Chu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接