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

Xml 如何在DTD和XSD之间进行选择,xml,xsd,dtd,Xml,Xsd,Dtd,我想使用DTD或XSD来描述我的XML文档。我读到XSD比DTD更好,因为它们支持名称空间和数据类型,而且DTD更老 这是否意味着我应该只在将来的所有需求中使用XSD,而完全忽略DTD作为选项?我甚至应该费心学习DTD的结构吗 在XSD和DTD之间选择什么因素?< P>对DTD结构的理解不会有什么坏处(这将有助于您更好地理解XSD的长期运行)…但是你应该使用XSDS向前移动。 < P>这取决于你需要设置的结构有多么复杂。 如果您需要名称空间和数据类型之类的东西,一定要使用XSD。如果您只需要一个

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

这是否意味着我应该只在将来的所有需求中使用XSD,而完全忽略DTD作为选项?我甚至应该费心学习DTD的结构吗


<>在XSD和DTD之间选择什么因素?

< P>对DTD结构的理解不会有什么坏处(这将有助于您更好地理解XSD的长期运行)…但是你应该使用XSDS向前移动。

< P>这取决于你需要设置的结构有多么复杂。

如果您需要名称空间和数据类型之类的东西,一定要使用XSD。如果您只需要一个快速的小模式进行检查,DTD将为您提供更快的性能,因为它不涉及XML解析


正如我所理解的,XSD是从DTD中得到的,因此理解DTD将为学习XSD奠定坚实的基础,并指出一些DTD的缺点。p> 学习DTD作为一个单独的练习可能很重要,这只是为了了解它们如何工作,以防您在其他地方遇到它们,这样您就可以了解XSD试图解决的一些问题

然而,对于您当前描述XML文档的目的,确实要坚持使用XSD


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

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

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

  • 您可以定义的数据类型 节点的值。[日期、编号、字符串等]
  • 您还可以定义自定义 数据类型,[例如,节点 ,可能的数据可以是 12个月中的一个月…所以你需要 以新的格式定义所有12个月 数据类型写入所有12个月 名称作为枚举值。。 如果输入错误,验证将显示错误 XML包含除 这12个值……]
  • 你可以把限制放在 元素的引用,使用 默认值为minOccurs和maxOccurs 值为1和1
  • 。。还有更多

    有一些限制:例如,

  • XSD文件中定义的元素(名称) 必须仅使用一种数据类型定义
  • 无法验证节点/属性 使用另一个的值 节点/属性

  • 这是一根旧绳子,但万一有人碰到它。。。从我所知道的,DTD仍然有两个XSD没有的好处,即包含XSD中不存在的实体函数。这是一个非常棒的特性,它告诉编译器如何通过识别要打开哪些程序来处理可能不熟悉的文件类型来处理它们

    此外,DTD被写入XML规范,因此它们可以直接写入XML文档,而XSD必须作为外部文件存在并连接。这没什么大不了的,尤其是在更大的文档中使用时


    我认为XSD仍然更好、更自然,因为它使用XML语法,只是想扮演魔鬼代言人的角色:)

    使用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”

    现在,您可以编写主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模式可以执行更复杂的验证。
    例如,如果DTD检查XML元素的数据类型是整数或字符串。XML模式可以执行更复杂的验证,例如XML元素是以大写字母开头的字符串还是正整数。最后,XML模式使用XML语法,这是开发web服务的自然选择。

    很好的简短信息回答:你的一句话让我感到奇怪:“因为它们是XML[…],你可以检查它们的[有效性]更简单”:有趣的是,您这样做似乎依赖于DTD标准——我的意思是XSD本身就是一个有效的XML文档,因此您可以在和XmlDocument或其他任何形式中打开它并解析信息。DTD不是有效的XML,因此如果您想编写读取DTD内容的代码(如构建XML类的代码生成器),您需要自己解析该格式。我确信有用于读取DTD文件的组件/实用程序,但XSDs通过(相对)容易解析的XML免费为您提供这些组件。@monoJohnny-您完全正确地认为XSD架构文档有DTD,但说架构文档的验证必然依赖于DTD并不完全正确;还有一个用于模式文档的XSD模式。DTD部分用于引导(当XSD初稿问世时,DTD已经得到广泛支持),部分用于比较(帮助熟悉DTD的读者理解模式文档的模式)。>>您无法使用另一个节点/属性的值验证节点/属性。这是否意味着我不能拥有动态数据类型?例如,用户可以在一个元素中配置一个数据库连接列表,并在不同的元素(比如服务)中使用连接名称,并让xsd验证是否存在在sevices元素中配置的同名连接?@balki,是的,这是不可能的。