Xsd DTD或XML模式。哪一个更好?
DTD和XML模式的优缺点是什么(我甚至不知道后者的正式名称是什么!)?哪个更好?为什么我们需要两种方法来做同一件事 编辑:我在读的一篇文章中发现了这一点,这促使我提出以下问题: 为什么使用W3CXML模式语言 W3CXML模式语言不是 只有模式语言。事实上,XML 规范描述文档类型 定义(DTD)作为 表达一个模式。此外 JAXB的预发行版本 参考实现只起作用 使用DTD——也就是说,不使用模式 用XML模式语言编写。 但是,XML模式语言是 比DTD丰富得多。例如 在XML模式中编写的模式 语言可以描述结构 关系和数据类型 无法表达(或不容易表达) 表示)在DTD中。有工具 可用于将DTD转换为W3C XML模式语言,所以如果 与一起使用的基于DTD的模式 JAXB的早期版本 参考实现,可以使用 这些工具用于将模式转换为 XML模式语言 我想我想要一些例子来说明为什么XML模式更好(如果它确实更好的话)Xsd DTD或XML模式。哪一个更好?,xsd,dtd,xml,Xsd,Dtd,Xml,DTD和XML模式的优缺点是什么(我甚至不知道后者的正式名称是什么!)?哪个更好?为什么我们需要两种方法来做同一件事 编辑:我在读的一篇文章中发现了这一点,这促使我提出以下问题: 为什么使用W3CXML模式语言 W3CXML模式语言不是 只有模式语言。事实上,XML 规范描述文档类型 定义(DTD)作为 表达一个模式。此外 JAXB的预发行版本 参考实现只起作用 使用DTD——也就是说,不使用模式 用XML模式语言编写。 但是,XML模式语言是 比DTD丰富得多。例如 在XML模式中编写的模式
- DTD不知道名称空间
- DTD具有
、#define
和#include
——或者,在不太面向C的情况下,能够定义速记缩写、外部 内容和一些条件解析#ifdef
- 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有时对我的一些初级工程师来说有点复杂。