DTD
DTD是什么?
文档类型定义 — Document Type Definition
DTD用来描述XML文档的结构,一个DTD文档包含:
- 元素(
ELEMENT
)的定义规范 - 元素之间的关系规则
- 属性(
ATTLIST
)的定义规则 - 可使用的实体(
ENTITY
)或符号(NOTATION
)规则
DTD文档与XML文档实例的关系
类与对象的关系
数据库表结构与数据记录
DTD作用
有了DTD,每个XML文件可以携带一个自身格式的描述。
有了DTD,不同组织的人可以使用一个通用DTD用来交换数据。
应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效
可以使用DTD校验自己的XML数据
DTD文档的声明及引用
内部DTD文档
<!DOCTYPE 根元素 [ 定义内容]>
外部DTD文档
<!DOCTYPE 根元素 SYSTEM "DTD文档路径">
内外部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径"[定义内容]>
windows下XML编辑软件xmlspy用他编辑XML格式文档
XMLspy2013简体中文版
\`#CDATA不在
ELEMENT`里面使用
内外部混合语法
XML代码
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE students SYSTEM "dtd_1.dtd"[
<!ELEMENT student (id,name,address)>
<!ELEMENT address (#PCDATA)>
]>
<students>
<student>
<id>123</id>
<name>张三&</name>
<address>北京</address>
</student>
</students>
DTD
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT students (student)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
元素定义的语法
<!关键字 元素名称 元素类型>
元素的类型
EMPTY
– 该元素不能包含子元素和文本,但可以有属性-(空元素)
<!ELEMENT address EMPTY>
<address id=”1″/>
这种标签里为正确可以包含属性,如果包含子元素或文本是错误的。
ANY
– 该元素可以包含任何在DTD中定义的元素内容
<!ELEMENT student ANY>
<student>
<name>东哥</name>
<id>1</id>
</student>
将根元素设为ANY类型后,元素出现的次数和顺序不收限制。
#PCDATA
– 可以包含任何字符数据,但是不能在其中包含任何子元素
<!ELEMENT address (#PCDATA)>
<address>北京</address>
为正确,里面如果添加任何子元素就为错误
组合类型实例
<!ELEMENT class (student+,teacher*)>
修饰符号
符号 | 用途 | 示例 | 实例说明 | ||
---|---|---|---|---|---|
() | 用来给元素分组 | (古龙\ | 金庸),(王硕\ | 玉洁),毛毛 | 分成三组 |
\ | 在列出的对象中选择一个 | (男人\ | 女人) | 表示男人或者女人必须出现,两者选一 | |
+ | 表示1次或多次 | (成员+) | 表示成员必须出现,而且可以出现多个成员 | ||
* | 0到多次 | (爱好*) | 爱好可以出现零次到多次 | ||
? | 0到1次 | (菜鸟?) | 菜鸟可以出现,也可以不出现,如果出现的话,最多出现一次 | ||
, | 必须按指定的顺序 | (西瓜,苹果,香蕉) | 表示必须按这个顺序出现 |
DTD属性的定义
<!ATTLIST 元素名称 属性名称 类型 属性特点 ……>
类型
CDATA 属性值可以是任何字符(数字中文英文)
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE students[
<!ELEMENT students (student)>
<!ELEMENT student (id+,name?,address)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name sex CDATA #REQUIRED>
]>
<students>
<student>
<id>1321</id>
<id>123</id>
<name sex="男">张三</name>
<address>北京</address>
</student>
</students>
NMTOKEN/NMTOKENS
NMTOKEN是CDATA的一个子集,表示属性值必须,英文字母、数字、句号、破折号、下划线或冒号,属性值不能含有空格。
NMTOKENS与NMTOKEN类似,包含多个由空格分割的字符。
ID
表明该属性的取值必须是唯一的
<!ELEMENT id ANY>
<!ATTLIST id vid ID #REQUIRED name CDATA #REQUIRED>
<id vid='1'>1321</id>
<id vid='2'>123</id>
如果再出现vid='1'那么就会报错
IDREF/IDREFS
IDREF属性的值指向文档中其它地方声明的ID类型的值
IDREFS同IDREF,但可以具有由空格分开的多个引用
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE home[
<!ELEMENT home (pepole+)>
<!ELEMENT pepole EMPTY>
<!ATTLIST pepole
id ID #REQUIRED
pid IDREFS #IMPLIED
name CDATA #REQUIRED>
]>
<home>
<pepole id="P_1" name="爸爸"/>
<pepole id="P_2" name="妈妈"/>
<pepole id="P_3" name="儿子" pid="P_1 P_2"/>
</home>
意思是:家庭里面有多个人,id必须有而且唯一的,pid是可有可无、是p1 p2的引用,name是必须有的字符串类型。
Enumerated 枚举
不能说的严格意义上的类型
<!ATILIST people sex (男|女|人妖) #REQUIRED>
语法括号中间加竖线 |
ENTITY/ENTITIES
属性特点
#REQUIRED
<!ATTLIST person number CDATA #REQUIRED>
前文已经提到过代表必须要有
#IMPLIED
元素的示例中可以忽略该属性
<!ATTLIST person number CDATA #REQUIRED>
前文已经提到可有可无
#FIXED value
元素实例中该属性的值必须为置顶的固定值
语法:<!ATTLIST 元素名 属性名 类型 #FIXED "value">
DTD示例:<!ATTLIST name id CDATA #FIXED '1'>
XML示例:<name id='1'/>
Defailt value
为属性提供一个默认的值 ,如果提供值可以覆盖。
语法: <!ATTLIST 元素名 属性名 类型 'value'>
DTD示例:<!ATTLIST hello payment_type CDATA "check">
XML示例:
实体ENTITY
内部实体语法(普通实体):<!ENTITY 实体名 "实体值">
DTD示例: <!ENTITY writer "QiDong">
XML示例: <author>&writer;</author>
外部实体语法(普通实体):<!ENTITY 实体名 SYSTEM "URI/URL">
DTD示例
<!ENTITY writer SYSTEM "http://www.w3c.com/entit.xml">
XML示例: <author>&writer;</author>
普通实体:即是在XML 内部定义的实体
参数实体:所谓参数实体的概念就是说该实体实际上不是在具体实例话文档中使用(XML文档),而是在DTD文档内部被使用。
示例
<!ENTITY %地址 "街道,城市,邮编,国家">
然后在DTD内部通过 %地址; 来引用它,具体例子如下:
<!ELEMENT 联系 (人名,电话,%地址;)>
外部参数实体 同上、外部实体。就是在DTD内部使用