DTD简述
全称 Document type DeFinition 文档类型定义
DTD作用
DTD是XML的一部分,描述XML文档结构,效验XML文档格式是否正确
DTD文档包含
元素的定义规则
元素之间的关系
属性的定义规则
可使用的实体或者符号规则
DTD与XML的关系
DTD是抽象的,XML是具体的
一个DTD可以生成多个XML,就像一个类可以生成多个对象
DTD局限性
不能扩展
不支持命名空间
只提供了有限的数据类型,用户无法自定义类型
不使用XML语法(写XML文档实例的时候用一种语法,写DTD用另一种语法)
CDATA和PCDATA
CDATA
character data 字符数据
使用在属性上面,表示属性的值是一般的字符串
PCDATA
parsed character data 被解析的字符数据
使用在元素上面,表示元素中间的内容是普通的字符串
声明元素
<!ELEMENT 元素名称 元素类型>
元素类型可取值
EMPTY:不能包含子元素和文本,但可以有属性(空元素)
示例:<!ELEMENT people EMPTY>
ANY:该元素包含DTD中定义的任何元素内容
示例:<!ELEMENT book ANY>
需要注意的是将根元素设置为ANY类型后,元素出现的次数和顺序不受限制
#PCDATA:只能是普通字符串,不能包括子元素
示例:<!ELEMENT name (#PCDATA)>
带有子元素(序列)的元素
示例:<!ELEMENT book (name,author,price)>
XML引用DTD两种方式
外部引用
book.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYstem "book.dtd">
<book>
<name>Java</name>
<author>John</author>
<price>99</price>
</book>
内部引用
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book [
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<book>
<name>Java</name>
<author>John</author>
<price>99</price>
</book>
DTD修饰符号
() 来用给元素分组
示例:(古龙|金庸),毛毛
| 多个选择一个
示例:(古龙|金庸),毛毛,必须按照指定顺序出现
示例:(古龙|金庸),毛毛
声明只出现1次的元素:
示例:<!ELEMENT book (name)>
声明出现大于等于1次的元素:
示例:<!ELEMENT book (name+)>
声明出现0或多次的元素:
示例:<!ELEMENT book (name*)>
声明出现0或1次的元素:
示例:<!ELEMENT book (name?)>
<!ATTLIST 元素名称 属性名称 属性类型 属性特点>
示例:<!ATTLIST name width CDATA "20">
属性类型的选项
CDATA:属性值可以是任何字符(包括数字和中文)
示例:<!ATTLIST name width CDATA "20">
NMTOKEN/NMTOKENS都是CDATA的子集
NMTOKEN表示属性值不能是含有空格
示例:<!ATTLIST name width NMTOKEN #REOUIRED>
NMTOKENS表示属性值允许有空格
示例:<!ATTLIST name width NMTOKENS #REOUIRED>
ID:表示该属性的取值必须是唯一的
示例:<!ELEMENT 公司职员 ANY>
<!ATTLIST 公司职员 编号 ID #REOUIRED 姓名 CDATA #REOUIRED>
正确
<公司职员 编号="Z001" 姓名="张三">
<公司职员 编号="Z002" 姓名="张三">
错误
<公司职员 编号="Z001" 姓名="张三">
<公司职员 编号="Z001" 姓名="张三">
IDREF/IDREFS
IDREF属性的值指向文档中其他地方声明的ID类型的值
IDREFS同IDREF,但可以具有由空格分开的多个引用
Enumerated:事先定义好的一些值,属性的值必须在所列出的值中一个
示例:<!ATTLIST name sex (boy|girl) #REOUIRED>
属性特点的选项
#required 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
Default value 属性值的默认值
#required
示例:<!ATTLIST name width CDATA #required>
标签name的width属性必须有
#IMPLIED
示例:<!ATTLIST name width CDATA #IMPLIED>
标签name的width属性有没有都可以
#FIXED
示例:<!ATTLIST name width CDATA #FIXED "20">
标签name的width属性值是固定的20,不等于20就是非法的
案例
book.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT book (name,price)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name id CDATA #required>
<!ELEMENT author (#PCDATA)>
<!ATTLIST author name CDATA #IMPLIED>
<!ELEMENT price (#PCDATA)>
<!ATTLIST price width CDATA #FIXED "20">
book.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYstem "book.dtd">
<book>
<!-- name元素id属性是必须的 -->
<name id="name">Java</name>
<!-- author元素name属性是可有可无 -->
<author name="author">John</author>
<!-- price元素width属性的值只能等于20 -->
<price width="20">99</price>
</book>
DTD实体
实体相当一个变量,引用已经定义好的值
内部语法
语法
<!ENTITY 实体名 "实体值">
DTD示例
<!ENTITY writer "writerContent">
<!ENTITY copyright "copyrightContent">
XML示例
<author>&writer;©right;</author>
外部声明
语法
<!ENTITY 实体名称 SYstem "URI/URL">
DTD示例
<!ENTITY copyright SYstem "http://www.baidu.com">
XML示例
<author>©right;</author>
实体类型分类
普通实体
使用场合
用在XML文档中
内部声明方式
<!ENTITY 实体名 "实体值">
外部声明方式
<!ENTITY 实体名称 SYstem "URI/URL">
引用方法
&实体名称;
参数实体
使用场合
用在DTD中元素和属性声明中
内部声明方式
<!ENTITY %实体名 "实体值">
外部声明方式
<!ENTITY %实体名称 SYstem "URI/URL">
引用方法
%实体名称;
更多内容请查看
点击打开链接