Xsd DTD或XML模式。哪一个更好?

Xsd DTD或XML模式。哪一个更好?,xsd,dtd,xml,Xsd,Dtd,Xml,DTD和XML模式的优缺点是什么(我甚至不知道后者的正式名称是什么!)?哪个更好?为什么我们需要两种方法来做同一件事 编辑:我在读的一篇文章中发现了这一点,这促使我提出以下问题: 为什么使用W3CXML模式语言 W3CXML模式语言不是 只有模式语言。事实上,XML 规范描述文档类型 定义(DTD)作为 表达一个模式。此外 JAXB的预发行版本 参考实现只起作用 使用DTD——也就是说,不使用模式 用XML模式语言编写。 但是,XML模式语言是 比DTD丰富得多。例如 在XML模式中编写的模式

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

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

为什么使用W3CXML模式语言

W3CXML模式语言不是 只有模式语言。事实上,XML 规范描述文档类型 定义(DTD)作为 表达一个模式。此外 JAXB的预发行版本 参考实现只起作用 使用DTD——也就是说,不使用模式 用XML模式语言编写。 但是,XML模式语言是 比DTD丰富得多。例如 在XML模式中编写的模式 语言可以描述结构 关系和数据类型 无法表达(或不容易表达) 表示)在DTD中。有工具 可用于将DTD转换为W3C XML模式语言,所以如果 与一起使用的基于DTD的模式 JAXB的早期版本 参考实现,可以使用 这些工具用于将模式转换为 XML模式语言

我想我想要一些例子来说明为什么XML模式更好(如果它确实更好的话)

  • DTD不知道名称空间

  • DTD具有
    #define
    #include
    #ifdef
    ——或者,在不太面向C的情况下,能够定义速记缩写、外部 内容和一些条件解析

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

  • XSD有一个类型系统

  • XSD有一种更丰富的语言来描述元素或属性内容的“外观” 系统

  • 可以将DTD内联到XML文档中,但不能使用XSD。这意味着DTD更安全(仅限您) 必须保护一个ByTestStream(xml/dtd),而不是
    多个)

  • “有效XML”的官方定义需要DTD。因为这可能是不切实际的,如果不是不可能的话,你经常不得不这样做 满足于schema valid,这是不完全相同的


就我而言,如果您有一个XSD,那么为一些XML编写一个验证器非常简单。我还没有在DTD中看到这一点,尽管我确信它是存在的。

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

几年前,有理由在XML模式上使用DTD(XML工具更常见或更好地支持DTD)。然而,今天,我认为没有理由不使用XMLSchema而不是DTD:XMLSchema更强大


然而,XML模式远不是完美的(只要试着阅读规范或关于XML模式的书……),从那时起,已经开发了许多替代方案(Schematron、Examplotron、RelaxNG)。与XML模式相比,这些模式可能具有技术优势,但XML模式如今更加普及,因此我认为很少有其他替代方案是有意义的

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

您可以将XSD与XML内联。只需使用正确的名称空间,并将模式嵌套在文档中。WSDL文件通常这样做。DTD会受到拒绝服务攻击。请看@lavinio,我认为您关于内联XSD的看法是正确的;我以前见过这样做的文件。关于十亿笑攻击的有趣文章。有没有任何DTD功能,不能在XSD中完成?是的!EditiX提供了一种用RELAXNG编写并将其转换为DTD或XSD的方法。我赞成放松。XSD有时对我的一些初级工程师来说有点复杂。