DTD和XML Schema的优点/缺点是什么(我甚至不确定后者的官方名称是什么!)?哪个更好?为什么我们需要两种方法来做同样的事情?
编辑:我在一篇正在阅读的文章中找到了这个,这促使我提出这个问题:
为什么选择W3C XML Schema语言?
W3C XML Schema Language不是 只有模式语言。实际上,XML 规范描述了文档类型 定义(DTD)作为方法 表达架构。此外, JAXB的预发布版本 参考实施仅起作用 使用DTD - 也就是说,不使用模式 用XML Schema Language编写。 但是,XML Schema Language是 比DTD更丰富。例如, 用XML Schema编写的模式 语言可以描述结构 关系和数据类型 无法表达(或不能轻易表达) 表达)在DTD中。有工具 可用于将DTD转换为W3C XML Schema Language,如果有的话 您使用的基于DTD的模式 早期版本的JAXB 参考实现,你可以使用 这些工具将模式转换为 XML模式语言。 http://java.sun.com/developer/technicalArticles/WebServices/jaxb/#binsch
我想我想举例说明为什么XML-Schema更好(如果确实如此)。
答案 0 :(得分: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,虽然我确定它存在。
答案 1 :(得分:10)
几年前,有理由将DTD用于XML Schema(XML工具更常见或更好地支持)。但是,今天,我认为没有理由不使用XML Schema而不是DTD:XML Schema功能更强大。
然而,XML Schema远非完美(只是尝试阅读关于XML Schema的规范或书籍......)并且从那时起已经开发了许多替代方案(Schematron,Examplotron,RelaxNG)。这些可能比XML Schema具有技术优势,但XML Schema今天更加普遍,我看到很少有一种替代方案有意义的情况。
答案 2 :(得分:5)
XML Schema可以执行更复杂的验证。例如,如果DTD可以检查XML元素的数据类型是整数还是字符串。 而XML模式可以执行更复杂的验证,例如xml元素是以大写字母或正整数开头的字符串。 最后,XML模式使用XML语法,它是开发Web服务的自然选择。
答案 3 :(得分:4)
还有Relax NG - 另一种用于验证XML文档的强大语言,以及来自DSDL的Schematron和其他技术。放松NG非常简单,具有人类可读形式 - Relax NG Compact,允许方案编写类似于BNF方案。