DTD,即文档类型定义,是一种用于定义XML(可扩展标记语言)文档结构的文件。在运用XML创建文档时,我们不仅需要指定具体的标签与内容,某些需求下还需告诉程序可用哪些标签、如何组合,这就是DTD文件的作用了。
一份DTD文件包含其定义的元素、属性以及实体器。它是我们可以使用的规则的集合,这些规则可用于验证一份XML文档是否有效。DTD对于确保数据的准确性和一致性至关重要。
在XML文档中,我们可以有两种类型的DTD:内部DTD声明和外部DTD声明。每种DTD类型都有优点和不足之处,它们应根据特定需求来选择。
内部DTD声明,以DOCTYPE关键字为中心进行声明,它像这样:
]>
在内部声明类型的DTD中,我们将DTD直接在XML文档中声明。这种方法在小型文档中十分方便,因为它当文档外部无须加载其他文件时,因此它对于快速传输相对非常有效。
然而,如果我们需要维护多个XML文档并且具有类似结构的元素,这种方法将变得非常繁琐。这就是外部DTD声明的优势。
外部DTD声明使用一个类似于这样的独立文件进行声明,以DTD文件结尾:
外部DTD声明需要一个独立的文件来存储DTD声明,从而使文档的管理变得更加简单。这也有助于确保DTD只有在需要的情况下才被加载,从而提高载入大型文档时程序的性能和速度。
无论使用哪种DTD声明类型,DTD文件中的定义采用一种由这些规则构成的语法。让我们看看如何定义这些规则:
元素规则:
定义XML文档中的元素时,我们需要在DTD文件中使用ELEMENT关键字。例如,在上面的Catalog DTD示例中,我们定义了Catalog、Title和Product元素。
描述标题元素:
这条规则所表示的含义是标题元素应该仅包含文本。在上面的DTD规则中,我们在“#PCDATAInternal Entity”中使用了一个表示“文本”的符号。我们也可以使用parseable内容定义P -标记内的内容,或使用一些其他指令来定义一个DTD规则。
属性规则:
属性规则描述了一个XML文档中可以使用哪些属性及其值有哪些限制。我们使用ATTLIST关键字定义一个属性规则。例如,在上面的DTD示例中,我们针对Product元素定义了属性规则,如下所示:
上述此规则不仅声明了Product的四个属性,还对每个属性进行了限制条件描述,默认情况下为CDTA。规则中的“#REQUIRED”表示该属性是必需的,而“#IMPLIED”表示该属性为可选的。
实体器规则:
实体器规则描述了特殊字符如何被处理以及如何在XML文档中使用。它们定义了XML文档中可以使用哪些字符,以及它们编码的方式。DTD包括两种类型的实体器:内部实体器和外部实体器。
内部实体器是DTD中声明的本地变量。这些变量可以在XML文档中使用。例如,我们可以在DTD文件中定义一个名为safe的字符实体器。
&">
使用ENTITY关键字定义Safe实体器,这表示在XML文档中可以使用名为“Safe”的字符实体器。<、&和>特殊字符被替换为“<”、“&”和“>”。
外部实体器是引用调用其他文件中声明的变量的变量。我们可以使用ENTITY关键字定义指向外部实体器的引用。例如:
使用SYSTEM指令在DTD文件中定义一个外部实体器。这个例子导入了另一个XML文件中的实体器 test-entity.xml,它包含了一些属性。
总结:
DTD文件是一种用于定义XML文档的结构的文件,它包含定义元素、属性以及实体器的规则。使用DTD规则,我们可以验证一份XML文档是否有效并且确保数据的准确性和一致性。通过内部和外部DTD规则,我们可以进行细粒度的XML定义和管理,使我们的XML编写变得更加简单、高效和可维护。