2010-03-05 58 views
47

我想要使用DTD或XSD来描述我的XML文档。我读过XSD比DTD更好,因为它们支持命名空间和数据类型,而且DTD比较老。如何选择DTD和XSD

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

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

+1

与vs问题有很大的重叠:http://stackoverflow.com/questions/1544200/what-is-difference-between-xml-schema-and-dtd – 2014-08-30 13:03:48

回答

44

把DTD作为一个单独的练习来学习可能很重要,只是为了知道它们在别处遇到它们时如何工作,以便您能够欣赏XSD试图解决的一些事情。

但是,对于您描述XML文档的当前目的,实际上坚持使用XSD。除了具有更丰富的功能集(比如你提到的,包括数据类型和名称空间)之外,它们本身也是XML文档,这非常有用。因为它们是XML,所以可以更容易地检查其格式和有效性,并且可以编写与常规XML文件一起使用的代码(例如,如果要从模式中自动生成代码类)

+0

好的短信息答案:你的句子让我想到了一些东西:'因为它们是XML [...],你可以更容易地检查它们的[有效性]:有趣的是,你所做的似乎依赖于DTD标准 - http://www.w3.org/2001/ XMLSchema.dtd – monojohnny 2011-11-03 16:44:50

+2

我的意思是,XSD本身是一个有效的XML文档,所以你可以打开它和XmlDocument或任何和解析信息。DTD不是有效的XML,因此如果您想编写读取DTD内容的代码(如构建XML类的代码生成器),则需要自己解析该格式。我确信有阅读DTD文件的组件/实用程序,但XSD通过(相对)容易解析的XML免费提供给您。 – 2011-11-03 18:25:38

+2

@monoJohnny - 你说得对XSD模式文档有一个DTD是正确的,但是说模式文档的验证必然依赖于DTD是不对的;模式文档还有一个XSD模式。 DTD部分用于引导(当XSD的初始草稿出来时,DTD已被广泛支持),部分用于比较目的(以帮助DTD精通的读者理解模式文档的模式)。 – 2012-08-22 01:25:38

5

理解DTD的结构(它可以帮助您更好地理解长期的XSD)并不会造成伤害......但您应该使用向前移动的XSD。

7

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

如果你需要像命名空间和数据类型的东西,绝对要用XSD。如果您只需要一个快速的小模式来检查,DTD就会提供更快的性能,因为不涉及XML解析。

据我所知,XSD是从DTD派生出来的,所以理解DTD将为学习XSD提供坚实的基础,并指出DTD的一些缺点。

5

在学习DTD无妨,但一定要使用XSD,因为XSD具有较强的实力,

有了XSD,你不仅可以验证结构的XML标签/层次也,

  1. 您可以定义数据类型为节点的 值。 [日期,数字,字符串等]
  2. 您还可以自定义 data_types,[例如,对于节点 ,可能的数据可以 12个月的一个..所以你需要 定义所有的12个月内新 数据类型编写所有的12个月 名作为枚举值.. 验证显示错误如果输入 XML包含比 这12个值的任何-其他值..]
  3. 你可以把限制的 元素的出现,使用 minOccurs和maxOccurs,默认 v线索是1和1.

..还有更多......

有一些限制:像,

  1. 在XSD文件 所述的元件(名称)必须只与一个数据类型来定义。
  2. 使用另一个 节点/属性的值无法验证节点/属性 。
+1

是否有任何DTD功能,在XSD中无法完成? – 2012-03-12 11:51:44

+2

@dma_k,无! .. – 2012-03-12 12:05:41

+0

>>您无法使用其他节点/属性的值验证节点/属性。 这是否意味着我不能拥有动态数据类型?例如,用户可以配置元素中的数据库连接列表,并在不同的元素(比如服务)中使用连接名称,并让xsd验证是否存在与sevices元素中配置的名称相同的连接? – balki 2012-03-22 20:21:39

2

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

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

我觉得XSD还远远更好,更自然,因为它使用XML语法,只是想唱唱反调:)

+0

据说[Here](http://stackoverflow.com/questions/1490583/dtd-or-xml-schema-which-one -is-better)XSD文件也可以与xml文档内联,请您详细解释第一个问题? (包含ENTITY功能) – Shohreh 2015-11-29 19:39:02

2

有一个恕我直言,以一个XSD如果可能一起使用DTD(非常重要的问题你在深验证需要):

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

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

在您的文档,你可以wherevever需要简单的代码和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和HABE不为t或复制 书本本身,此外,您可以在一个地方进行维护,并对任何文档进行全面更改。

+1

这是一个很好的观点,但如果需要验证,我可能会改变“(如果需要进行深度验证,可以与XSD一起)”(“如果需要验证,可以与XSD一起使用)”。这是因为你的例子都没有验证XML。它们只是内部子集中的实体声明。如果需要验证,则需要使用XSD或需要提供完整的DTD(外部或内部子集)。 – 2014-03-20 22:58:30

0

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