DTD文档类型定义
DTD不是xml文档,它是xml是约束。在DTD中定义元素,定义属性,然后某个xml与这个DTD关联,这时xml中只能出现在DTD中定义的元素了。
DTD定义元素语法
<!ELEMENT 元素名 元素描述>
<!ELEMENT students (student+)>
,定义元素students,其内容为1~N个student元素<!ELEMENT students (#PCDATA)>
,定义元素students,内容为纯文本<!ELEMENT student(name,age,sex)>
,定义元素student,内容依次为name、age、sex元素 。<!ELEMENT student ANY>
定义名为student元素,内容为意。<!ELEMENT student EMPTY>
,定义名为student元素,不能有内容,即空元素,注意空元素是可以有属性的。
子元素出现的次数
可以使用*、+、?来指定子元素出现的次数。
- *:可以出现0~N次;
- +:可以出现1~N次;
- ?:可以出现0~1次;
例如:
<!ELEMENT student(name?,hobby*,score,sex)>
。
枚举类型
<!ELEMENT gfs(g1 | g2)*>
多次选择。
DTD的分类
- 内部DTD和外部DTD
- 外部DTD分为:SYSTEM(本地的)和PUBLIC(网上的)
内部DTD:
- 位置:内部DTD在文档声明下面,在根元素上面;
- 语法格式:放到
<!DOCTYPE 根元素名称 [
和]>
之间; - 只对当前XML文档有效;
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students[
<!ELEMENT students(student+)>
<!-- 定义元素students,其内容为1~N个student元素 -->
<!ELEMENT student(name,age,sex)>
<!-- 定义元素student,内容依次为name、age、sex元素 -->
<!ELEMENT name(#PCDATA)>
<!-- 定义元素name,内容为纯文本 -->
<!ELEMENT age(#PCDATA)>
<!-- 定义元素age,内容为文本 -->
<!ELEMENT sex(#PCDATA)>
<!-- 定义元素sex,内容为文本 -->
]>
<students>
<student number="0001">
<name>zhangsan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="0002">
<name>lisi</name>
<age>22</age>
<sex>female</sex>
</student>
</students>
本地 SYSTEM DTD
- 位置:本地硬盘上;
- 语法格式:
<!DOCTYPE 根元素 SYSTEM "dtd文件路径">
直接定义元素或属性即可; - 本地所有XML文档都可以引用这个dtd文档;
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM "students.dtd">
<students>
<student>
<name>zhangsan</name>
<age>23</age>
<sex>male</sex>
</student>
<student number="0002">
<name>lisi</name>
<age>22</age>
<sex>female</sex>
</student>
</students>
students.dtd
<!ELEMENT students(student+)>
<!ELEMENT student(name,age,sex)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT age(#PCDATA)>
<!ELEMENT sex(#PCDATA)>
PUBLIC DTD
- 位置:放到网络上。
- 语法:
<!DOCTYPE 根元素 PUBLIC "dtd文件" "dtd路径">
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE students PUBLIC "-//qdmmy6//DTD ST 1.0//ZH" "http://www.qdmmy6.com/xml/dtds/st.dtd">
<!-- 官网给定的名称和地址"-"表示非官方 -->
<students>
<student>
<name>zhangsan</name>
<age>23</age>
<sex>male</sex>
</student>
</students>
DTD定义属性
语法
<!ATTLIST 元素名 属性名 属性类型 设置说明>
例如:
<!ATTLIST student number CDATA #REQUIRED>
,给student元素定义属性number,类型为文本,这个默认是必须的。
属性类型
- CDATA :文本类型;
- Enumerated:枚举类型;
- ID:ID类型,ID类型属性用来标识元素的唯一性。即元素的ID属性值不能与其他元素的ID属性值相同,ID值不能以数字开头。
- IDREF:ID引用类型,用来指定另一个元素,与另一个元素建立关联关系,IDREF类型的属性值必须是一个元素的ID。
属性设置说明
- #REQUIRED: 说明属性是必须的;
- #IMPLIED: 说明属性是可选的;
- 默认值:在不给出属性时,使用默认值;
<!ATTLIST student number ID #REQUIRED>
<!-- 为student定义属性number,类型为ID,该属性必须是必须出现的。 -->
<!ATTLIST student sex(male | female) "male">
<!-- 为student定义属性sex,类型为枚举,默认值为“male” -->
<!ATTLIST student friend IDREF #IMPLIED>
实体
定义实体:定义变量。
引用实体:使用变量。
实体分类
- 一般实体:定义实体在DTD中,实体应用在xml中。
- 参数实体:定义实体在DTD中,实体引用在DTD(内部DTD不太好使)中。
定义一般实体
格式:
<!ENTITY 实体名 "实体值">
<!ENTITY ch "中华人民共和国">
引用一般实体
<student number="ID_001" name="zhangsan" country="&ch;"/>
<student number="ID_002" name="zhangsan" friend="ID_001" country="&ch;"/>
定义参数实体
格式:
<!ENTITY % 实体名 "实体">
<!ENTITY % friend "sutdent friend IDREF #IMPLIED">
引用参数实体
<!ATTLIST %friend;>
相当于转换成:
<!ATTLIST student friend IDREF #IMPLIED>