ELEMENT定义元素内容规则,ATTLIST定义属性规则;前者规定元素能包含什么内容,后者规定元素可带哪些属性、类型及默认值。

DTD 中的 ELEMENT 和 ATTLIST 是定义 XML 文档结构和约束的核心语法。前者管“元素能长什么样”,后者管“元素能带哪些属性”。用对了,XML 才能被规范解析;写错了,解析器会直接报错。
ELEMENT:定义元素的内容规则
它声明某个元素允许包含什么内容,比如纯文本、子元素、空内容,或任意组合。
-
#PCDATA 表示只能放解析过的字符数据(即普通文本),不能嵌套其他标签:
<!ELEMENT title (#PCDATA)> -
子元素序列 用逗号分隔,表示必须按顺序出现且各一次:
<!ELEMENT book (title, author, isbn)> -
可选/重复子元素 用符号控制次数:
<!ELEMENT paragraph (emphasis*, sentence+)>(*表示 0 次或多次,+表示至少一次) -
EMPTY 表示该元素不能有任何内容,只能写成自闭合形式:
<!ELEMENT br EMPTY>→ 合法写法是<br/> -
ANY 表示不限制内容(不推荐在严格场景使用):
<!ELEMENT content ANY>
ATTLIST:定义元素的属性规则
它给已声明的元素添加属性,并规定每个属性的类型、是否必填、默认值等。
- 基本格式:
<!ATTLIST 元素名 属性名 类型 默认值> -
CDATA 是最常用类型,表示属性值是普通字符串:
<!ATTLIST img src CDATA #REQUIRED>(src必须出现) -
#IMPLIED 表示该属性可有可无,没写就不提供值:
<!ATTLIST p align CDATA #IMPLIED> - #REQUIRED 表示 XML 中必须显式写出这个属性,否则解析失败
-
"default" 是带引号的字符串,默认值,当属性未出现时自动补上:
<!ATTLIST button type CDATA "submit">→<button>点我</button>等价于<button type="submit">点我</button> -
#FIXED "value" 表示该属性值固定不可改,XML 中即使写了也必须跟 DTD 一致:
<!ATTLIST version number CDATA #FIXED "2.1">
实际配合使用的例子
假设要定义一个简单配置项 <server host="localhost" port="8080"/>:
- 先声明它是空元素:
<!ELEMENT server EMPTY> - 再给它加两个属性:
<!ATTLIST server host CDATA #REQUIRED port CDATA "8080"> - 这样就要求
host必须写,port可省略(默认为 8080)
注意几个易错点
-
ELEMENT和ATTLIST都必须大写,且前后紧贴<!和> - 一个元素可以有多个
ATTLIST声明(但通常写在一起更清晰) -
ATTLIST只能作用于已用ELEMENT声明过的元素,否则无效 - 属性默认值、固定值、枚举值等所有字符串都必须用单引号或双引号包裹
基本上就这些。不复杂但容易忽略大小写和引号,写完建议用支持 DTD 验证的编辑器或解析器跑一遍。










