如何在DTD和XSD之间进行选择

时间:2010-03-05 20:32:54

标签: xml xsd dtd

我想使用DTD或XSD来描述我的XML文档。我读过XSD比DTD更好,因为它们支持名称空间和数据类型,并且DTD更老。

这是否意味着我应该只将XSD用于未来的所有需求,并完全忽略DTD作为选项?我是否应该费心学习DTD的结构?

在XSD和DTD之间进行选择时,我应该考虑哪些因素?

7 个答案:

答案 0 :(得分:45)

将DTD作为一项单独的练习学习可能很重要,只是为了了解它们在其他地方遇到它们时的工作原理,以便您可以欣赏XSD试图解决的一些问题。

但是,对于您当前描述XML文档的目的,确实坚持使用XSD。

除了拥有更丰富的功能集(就像你提到的那样,包括数据类型和名称空间),它们本身也是XML文档,它们非常有用。因为它们是XML,所以您可以更轻松地检查它们的格式和有效性,并且您可以编写与常规XML文件一样的代码(例如,如果您想从模式自动生成代码类)

答案 1 :(得分:8)

这实际上取决于您需要设置的结构有多复杂。

如果您需要命名空间和数据类型等内容,请务必使用XSD。如果您只需要一个快速的小模式来检查,DTD将为您提供更快的性能,因为不涉及XML解析。

据我了解,XSD源自DTD,因此理解DTD将为学习XSD奠定坚实的基础,并指出DTD的一些缺点。

答案 2 :(得分:6)

理解DTD的结构并没有什么坏处(从长远来看它会帮助你更好地理解XSD)......但你应该使用XSD向前发展。

答案 3 :(得分:5)

学习DTD没有坏处,但一定要使用XSD,因为XSD有更强的力量,

使用XSD,您不仅可以验证XML标记的结构/层次结构,还可以

  1. 您可以定义数据类型 节点的值。 [日期,数字,字符串等]
  2. 您还可以定义自定义 data_types,[例如,节点 ,可能的数据可以 12个月中的一个..所以你需要 以新的方式定义所有12个月 所有12个月的数据类型写作 name作为枚举值.. 如果输入,验证显示错误 XML包含任何其他值 这12个值..]
  3. 你可以把限制放在 发生的元素,使用 minOccurs和maxOccurs,默认值 值为1和1.
  4. ..还有更多...

    有一些限制:如,

    1. XSD文件中定义的元素(名称) 必须只用一种数据类型定义。
    2. 您无法验证节点/属性 使用另一个的价值 节点/属性。

答案 4 :(得分:3)

使用DTD有一个非常重要的问题(如果你需要进行深度验证,可能还有一个XSD):

在DTD中,您可以定义自己的实体,例如:

<!ENTITY MyName "DrDr.Hannibal Xerxes Utah,MBA and CEO">

在您的文档中,您可以在任何需要的地方使用简单的代码和MyName;而是输入所有这些东西。

此外,假设您有一个类似XML的文件(可能由其他一些应用程序生成),该文件由许多类似的标签组成,但没有根标签,例如:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<Book Author="Author1">
  <Titel>Erstes Buch</Titel>
</Book>
...
<Book Author="Author5">
  <Titel>Fünftes Buch</Titel>
</Book>

假设此文件名为“Booklist.TXT”,

现在您可以编写master-xml代码:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<DOCTYPE MyRoot [
<ENTITY AllBooks SYSTEM "Booklist.TXT">
]

<MyRoot>
... some prefix-stuff as needed ...
&AllBooks; <!-- here are all the Books -->
... some post stuff es needed ...
</MyBook>

每当你需要在另一个上下文中使用这些书时,你只需编写周围的xml代码,不得触摸或复制 书单本身,您可以在一个地方进行维护,并在任何文档中进行所有更改。

答案 5 :(得分:2)

这是一个旧字符串,但万一其他人遇到它...从我可以告诉DTD仍然有两个好处,XSD没有,即包含在XSD中不存在的ENTITY函数。这是一个非常棒的功能,通过识别要打开的程序来处理它们,告诉编译器如何处理可能不熟悉的文件类型。

此外,DTD被写入XML规范,因此可以直接写入XML文档,而XSD必须作为外部文件存在并连接。无论如何,特别是在使用更大的文档时,这并不是什么大问题。

我认为XSD仍然更好更自然,因为它使用XML语法,只是想扮演魔鬼的拥护者:)

答案 6 :(得分:0)

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