DTD
2017-12-18 本文已影响0人
小明滚出去_
一、声明
- 内部DOCTYPE
<!DOCTYPE 根元素 [元素声明]>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
- 外部DOCTYPE
<!DOCTYPE 根元素 SYSTEM "文件URI">
<!DOCTYPE 根元素 PUBLIC "文件名" "文件URI">
二、XML结构
- 元素
- 属性
- 实体
< > & " '
- PCDATA(默认)
- CDATA
三、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属性声明
- 语法
默认属性约束是IMPLIED,需指定默认值<!ATTLIST 元素名称 属性名称 属性类型 默认值>
- 属性类型
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">