当我们在解析XML文档时,DTD文档类型定义(Document Type Definition)起着非常重要的作用。通过DTD,我们可以定义XML文档中的元素、属性以及结构,并且可以根据DTD来验证XML文档的合法性。本篇攻略将深入探讨DTD的相关知识。
什么是DTD
DTD文档类型定义是一个标记语言,用于定义XML文档的结构和语法规则。通过DTD,我们可以定义XML文档的元素、属性、实体等信息,还可以定义文件中元素和属性的数量和顺序,其中包括:
- 元素的名称和类型;
- 属性和属性值的定义;
- 实体的定义;
- 元素和属性的层次结构;
- 元素和属性的默认值。
DTD定义了XML文档的格式,类似于编程语言中的类型定义。在XML文档中使用DTD,则可以实现文档的结构化和验证。
定义DTD
下面的示例将展示如何定义DTD以及如何将其应用于XML文档。这里,我们将使用一个简单的DTD来定义一个购物清单。
DTD定义
首先,我们使用DTD定义一个名为shoppinglist的元素,其中包含多个item元素。每个item元素包含以下三个属性:id、name和price。
<!DOCTYPE shoppinglist [
<!ELEMENT shoppinglist (item+)>
<!ELEMENT item (name, price)>
<!ATTLIST item id CDATA #REQUIRED>
<!ATTLIST item name CDATA #REQUIRED>
<!ATTLIST item price CDATA #REQUIRED>
]>
这个DTD定义了shoppinglist元素,它的子元素是一组item元素。每个item元素包含name、id和price属性,这些属性必须在item元素中出现。其中,id、name和price都是CDATA类型的属性,并且必须出现。
应用DTD到XML文档
接下来,我们可以将上面的DTD应用到一个XML文档中。我们的XML文档将包含一个名为shoppinglist的元素,其中包含三个item元素。每个item元素都包含一个name、id和price属性。
<?xml version="1.0"?>
<!DOCTYPE shoppinglist SYSTEM "shoppinglist.dtd">
<shoppinglist>
<item id="001" name="Milk" price="2.99"/>
<item id="002" name="Bread" price="1.99"/>
<item id="003" name="Eggs" price="2.29"/>
</shoppinglist>
在这个XML文档中,我们将DOCUMENT TYEP声明的SYSTEM关键字指向了DTD的文件位置shoppinglist.dtd。这样,XML解析器就可以使用DTD验证文档的合法性了。
DTD的语法
接下来,我们将对DTD的语法做出更进一步的界定。了解DTD的语法是理解其设计的关键。
元素类型
在DTD中,元素类型包含以下两个部分:
- 元素名称(Element Name):DTD中定义的元素的名称(比如上面的shoppinglist元素);
-
元素类型名称(Element Type Name):定义元素类型的关键字,包括以下5个:
-
EMPTY:表示元素没有子元素(比如hr、br等);
- ANY:表示元素可以包含任何内容(不推荐使用);
- CDATA:表示元素的内容是字符数据;
-
PCDATA:表示元素的内容可以包含文本和实体;
- 子元素内容规定,如(item+)表示多个item元素。
属性类型
在DTD中,属性类型包含以下两个部分:
- 属性名称(Attribute Name):定义的属性的名称(比如上面的id、name以及price属性);
-
属性类型(Attribute Type):定义属性类型的关键字,包括以下3个:
-
CDATA:表示属性的值是一组字符数据;
- ID:表示属性的值是一个唯一的标识符;
- 其他属性类型规范,如有多个值的枚举类型:(yes|no),以及CDATA类型的默认值#IMPLIED等。
实体
实体在DTD中被分为内部实体和外部实体。
- 内部实体:使用<!ENTITY>标记定义的实体,表示在DTD内部定义实体的内容;
- 外部实体:可以通过DTD外部引用的实体。在DTD中,使用SYSTEM或PUBLIC关键字来定义外部实体,其中SYSTEM对应的是一个本地DTD文件,而PUBLIC对应的是一个公共DTD文件,需要从公共服务器获取。
实体还可以分为字符实体和参数实体。
- 字符实体:表示可替换的字符串,使用<!ENTITY>标记定义;
- 参数实体:即“参数实体引用”,也是可替换的字符串,但必须在DTD中使用%定义。
注释
注释在DTD中使用“”注释,在DTD中作为其内部的标记的一部分。在DTD定义中,注释是作为DTD注释中的宿主。除此之外,还有一个DTD标记中特定的注释方式。如:
<!-- Declarations for example DTD -->
<!ELEMENT root (branch*(1,2))>
<!ELEMENT branch (subbranch*,leaf)>
“Declarations for example DTD”语句是DTD注释,<!ELEMENT>”语句是DTD标记,其中root和branch表示前面DTD注释所宣称的声明。
总结
本篇攻略深入解析了DTD文档类型定义的相关知识,包括DTD的定义、语法以及其应用到XML文档中的过程。我们还看到了DTD的元素类型、属性类型以及实体等相关概念,并探讨了DTD的注释。了解DTD的这些方面,将有助于更好地理解XML的使用,提高文档解析的效率和准确性。
附示例:一个简单的DTD定义和应用到XML的过程的运行结果image。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入解析XML中的DTD文档类型定义 - Python技术站