Skip to content

DTD 示例

文档类型定义(DTD,Document Type Definitions)是一种定义 XML 文档合法结构和元素的方式。它们为特定 XML 格式提供了基本语法。

虽然 DTD 是早期标准,但 XML Schema 定义(XSD,XML Schema Definition) 是现代、功能更强大且被广泛用于定义 XML 结构、数据类型和约束的标准。XSD 提供更丰富的功能,如数据类型(整数、字符串、日期)、命名空间支持以及更复杂的结构规则。

然而,理解 DTD 对于处理遗留系统或更简单的 XML 格式可能有所帮助。下面是一些演示 DTD 语法的示例。

了解更多关于 XML Schema (XSD) 的信息

这个 DTD 定义了一个简单电视节目表的结构。

<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ELEMENT CHANNEL (BANNER, DAY+)>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE, (HOLIDAY | PROGRAMSLOT+)+)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME, TITLE, DESCRIPTION?)>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ATTLIST TITLE RATING CDATA #IMPLIED
LANGUAGE CDATA #IMPLIED>
<!ELEMENT DESCRIPTION (#PCDATA)>
]>

要点:

  • TVSCHEDULE 必须包含一个或多个 (+) CHANNEL 元素。
  • CHANNEL 必须包含恰好一个 BANNER 和一个或多个 DAY 元素。
  • DAY 包含一个 DATE,然后是包含一个或多个元素的序列,其中每个元素可以是 HOLIDAY 或一个或多个 PROGRAMSLOT。
  • PROGRAMSLOT 中的 DESCRIPTION 是可选的 (?)。
  • #PCDATA 指的是已解析字符数据(文本)。
  • #REQUIRED 属性必须存在;#IMPLIED 属性是可选的。

这个 DTD 定义了报纸文章的结构,并包含了实体定义。

<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE, BYLINE, LEAD, BODY, NOTES)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED
EDITOR CDATA #IMPLIED
DATE CDATA #IMPLIED
EDITION CDATA #IMPLIED>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ENTITY NEWSPAPER "Vervet Logic Times">
<!ENTITY PUBLISHER "Vervet Logic Press">
<!ENTITY COPYRIGHT "Copyright 2023 Vervet Logic Press">
]>

要点:

  • NEWSPAPER 包含一个或多个 ARTICLE 元素。
  • ARTICLE 需要按顺序包含 HEADLINE、BYLINE、LEAD、BODY 和 NOTES。
  • ARTICLE 需要一个 AUTHOR 属性。
  • ENTITY 定义创建快捷方式。例如,在符合此 DTD 的 XML 文档中使用的 &NEWSPAPER; 将被替换为 “Vervet Logic Times”。

这个 DTD 展示了更复杂的属性定义,包括枚举类型和默认值。

<!DOCTYPE CATALOG [
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT (SPECIFICATIONS+, OPTIONS?, PRICE+, NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool | Table | ShopProfessional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh | Milwaukee | Chicago) "Chicago"
INVENTORY (InStock | Backordered | Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal | Polished | Matte) "Matte"
ADAPTER (Included | Optional | NotApplicable) "Included"
CASE (HardShell | Soft | NotApplicable) "HardShell">
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>
<!ELEMENT NOTES (#PCDATA)>
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "jd@jd-tools.com">
]>

要点:

  • PRODUCT 元素的属性具有枚举的可能值(例如,CATEGORY 只能是列出的选项之一)。
  • 为某些属性提供了默认值(例如,如果省略 CATEGORY,则默认为 “HandTool”)。
  • SPECIFICATIONS 必须出现一次或多次 (+)。
  • OPTIONS 和 NOTES 是可选的 (?)。