一、声明
<!DOCTYPE 根元素 [元素声明]>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<!DOCTYPE 根元素 SYSTEM "文件URI">
<!DOCTYPE 根元素 PUBLIC "文件名" "文件URI">
二、XML结构
三、DTD元素声明
- 指定类别
<!ELEMENT 元素名称 类别>
如
<!ELEMENT br EMPTY>
<!ELEMENT note ANY>
- 指定内容
<!ELEMENT 元素名称 (元素内容)>
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> 有序
<!ELEMENT 元素名称 (子元素名称 1|子元素名称 2|.....)+> 无序
如
<!ELEMENT from (#PCDATA)>
<!ELEMENT note (to,from,heading,body)>
且字段可以按正则定义:
<!ELEMENT note (message+)>至少一次
<!ELEMENT note (message*)>零次或多次
<!ELEMENT note (message?)>零次或一次
<!ELEMENT note (to,from,header,(message|body))>或关系
在声明元素有子元素序列时需要按顺序声明子元素,子元素也遵循这个规则。
- 混合内容(不推荐)
<!ELEMENT 元素名称 (#PCDATA | 子元素1 | 子元素2 ...)*>
这里的'|'不代表'或'关系,表示这些元素可以无序出现任意多次,如:
<!DOCTYPE root [
<!ELEMENT root (#PCDATA | a | b )* >
<!ELEMENT a (#PCDATA | c | d)* >
<!ELEMENT c (#PCDATA)>
<!ELEMENT d (#PCDATA)>
<!ELEMENT b (#PCDATA)>
]>
<root>
<b>bbbbb11111</b>
this is some datas
<a>
this is aaaaaaaaaa
<c>ccccccc</c>
<c>ccccccc22222</c>
<d>dddddddd</d>
</a>
<b>bbbbbb</b>
<b>bbbbb2222</b>
</root>
四、DTD属性声明
- 语法
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
默认属性约束是IMPLIED,需指定默认值
- 属性类型
CDATA —— 字符串
(en1|en2|..) —— 枚举
ID —— 主键id,表示该属性为唯一值
IDREF —— 关联元素的id
IDREFS —— 关联多个元素的id,以空格分割
NMTOKEN —— 元素标识,比id宽松,比CDATA严格,类似CSS中的class?
NMTOKENS —— 多个元素标识
ENTITY —— 未解析实体
ENTITIES —— 未解析实体列表,多个以空格分割
NOTATION —— 属性值只能是符号名
xml:
- 默认值
value
#REQUIRED —— 必须值
#IMPLIED —— 非必须值
#FIXED value —— 固定值
- 当为元素定义属性类型为ENTITY\ENTITIES时,属性值只能是未解析实体:
先定义符号:
<!NOTATION pdf PUBLIC "PDF" "E:/Adobe Reader.exe" >
在定义未解析实体:
<!ENTITY book SYSTEM "book.pdf" NDATA pdf>
最后定义元素和属性:
<!ELEMENT ebookstore (#PCDATA)>
<!ATTLIST ebookstore content ENTITY "book">
五、DTD实体声明
- 普通实体,只能XML文档用
<!ENTITY 实体名 "实体值">
XML文档中使用: &实体名;
- 参数实体,只能DTD使用,且必须先定义后使用
<!ENTITY % 实体名 "实体值">
DTD中使用: %实体名;
- 外部实体,XML使用
<!ENTITY 实体名 SYSTEM "uri">
<!ENTITY 实体名 PUBLIC "name" "uri">
- 外部参数实体,DTD使用
<!ENTITY % 实体名 SYSTEM "uri">
<!ENTITY % 实体名 PUBLIC "name" "uri">
- 未解析实体
定义外部实体时,如果uri引用的文件不是文本文件或者不符合xml规范,则需要将该实体定义为未解析实体
<!ENTITY % 实体名 SYSTEM "uri" NDATA 符号名>
<!ENTITY % 实体名 PUBLIC "name" "uri" NDATA 符号名>
符号名必须先定义后使用
六、DTD符号声明
<!NOTATION 符号名 SYSTEM "value">
<!NOTATION 符号名 PUBLIC "id" "value">