XML文档中如何声明和使用内部DTD?
那在实际编写XML文档时,内部DTD具体该怎么嵌入和应用呢?
作为历史上今天的读者,我在处理数据格式规范时发现,很多新手在使用XML时容易忽略DTD的作用,而内部DTD因为直接嵌入文档,对小型项目来说特别实用。
什么是内部DTD?简单说,它是直接写在XML文档内部的文档类型定义,用来约束XML的结构和内容。为什么要用内部DTD?在一些小型数据交换场景中,比如个人整理的通讯录XML,不需要单独维护外部文件,内部DTD能让文档更紧凑。
内部DTD的声明有固定格式,咱们来看具体怎么写:
声明格式:<!DOCTYPE 根元素 [ ... ]>
,其中[ ... ]
里就是具体的约束规则。
比如一个记录书籍信息的XML,根元素是books
,声明就可以写成:<!DOCTYPE books [ ... ]>
元素声明是内部DTD里最常见的规则,用来定义XML中可以出现哪些元素,以及元素的内容类型。
| 元素内容类型 | 声明示例 | 说明 |
|--------------|----------|------|
| 空元素 | <!ELEMENT 图片 EMPTY>
| 表示该元素没有内容,比如<图片/>
|
| 文本元素 | <!ELEMENT 书名 (#PCDATA)>
| 表示元素只能包含文本,比如<书名>XML入门</书名>
|
| 包含其他元素 | <!ELEMENT 书籍 (书名,作者)>
| 表示书籍
元素必须包含书名
和作者
,且顺序固定 |
<!ELEMENT>
,这是不能写错的。*
(0次或多次)、+
(1次或多次)、?
(0次或1次)来表示出现次数,比如<!ELEMENT 章节 (段落*)>
表示章节
里可以有0个或多个段落
元素。除了元素,属性也需要在内部DTD中声明,规定属性的名称、所属元素和取值规则。
声明格式:<!ATTLIST 元素名 属性名 属性类型 默认值>
比如为书籍
元素添加编号
属性:
<!ATTLIST 书籍 编号 ID #REQUIRED>
ID
表示该属性值是唯一的,不能重复;#REQUIRED
表示这个属性必须填写。CDATA
(字符数据)、(值1|值2|值3)
(枚举值,只能选其中一个)等。在实际使用中,内部DTD虽然方便,但也有需要留意的地方:
<
、&
等特殊字符,需要用实体引用,比如<
表示<
,这些也可以在内部DTD中定义实体。在现在的数据处理中,XML虽然不如JSON流行,但在一些传统系统和配置文件中仍被广泛使用。根据行业观察,约30%的中小型企业内部数据交换仍依赖XML,而内部DTD因为简单易维护,在这些场景中的使用率超过60%。掌握它的声明和使用方法,能让咱们在处理这类数据时更得心应手。