XML文件引入DTD文件,这样XML可以自定义标签,但又受到DTD文件的约束。
1、dtd文档的声明及引用
1.1内部dtd文档
<!DOCTYPE 根元素 [定义内容]>
1.2外部dtd文档
引入外部的DTD文档分为两种:
(1)当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上”DTD的文件路径”,如下:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
(2)如果引用的DTD文件是一个公共的文件时,采用PUBLIC标识,如下方式:
<!DOCTYPE根元素 PUBLIC "DTD名称" "DTD文件的URL">
例:structs2约束
<!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
2、元素定义
2.1 简单元素
<!ELEMENT NAMECONTENT>
其中:
- ELEMENT是关键字,是不能修改的
- NAME表示元素名称
- CONTENT是元素类型,必须要大写!CONTENT的内容有三种写法:
(1)EMPTY——表示该元素不能包含子元素和文本,但可以有属性。
(2)ANY——表示该元素可以包含任何在该DTD中定义的元素内容
(3)(#PCDATA)——可以包含任何字符数据,但是不能在其中包含任何子元素,只有这个有括号
2.2 复杂元素
<!ELEMENT元素名称 (子元素)>
关于组合类型,有下述的的修饰符可以使用:
符号 | 用途 | 示例 | 示例说明 |
() | 用来给元素分组 | (张三|李四),(王二|麻子) | 分成两组 |
| | 在列出的对象中选一个 | (男人|女人) | 男人或女人,必选其一 |
+ | 该对象必须出现一次或者多次 | (成员+) | 成员必须出现,且可以出现多个成员 |
* | 该对象允许出现0次或者多次 | (成员*) | 成员可以出现任意次数,也可以不出现 |
? | 该对象必须出现0次或者1次 | (成员?) | 成员可以不出现,出现则最多一次 |
, | 对象必须按指定的顺序出现 | (苹果,香蕉,葡萄) | 必须按照苹果,香蕉,葡萄的顺序出现 |
3、属性定义
<!ATTLIST 元素名称
属性名称类型 属性特点
属性名称类型 属性特点......
>
3.1 属性类型
(1) CDATA
(2) ID
(3) IDREF/IDREFS
(4) Enumerated
3.2 属性特点
(1) #REQUIRED,表示这个属性必须给,不给就报错
(2) #IMPLIED,表示这个属性可以给也可以不给
(3) #FIXED value,表示这个属性必须给一个固定的value值
(4) Default value,表示这个属性如果没有值,就分配一个默认的value值
3.3 详细解释
(1)属性类型-CDATA,表示属性值可以是任何字符(包括中文和数字)
<!ATTLIST学生
姓名 CDATA#REQUIRED
>
<学生 姓名="张三"/>
<学生 姓名="zhangsan"/>
<学生 姓名="3"/>
(2)属性类型-ID,表明该属性的取值必须是唯一的,但是属性的值不能是以数字开头!
<!ELEMENT学生 ANY>
<!ATTLIST 学生
学号 ID#REQUIRED
姓名 CDATA #REQUIRED
>
<学生 学号="15001" 姓名="张三"/>
<学生 学号="15002" 姓名="李思"/>
(3)属性类型-IDREF/IDREFS
- IDREF属性的值指向文档中其它地方声明的ID类型的值
- IDREFS同IDREF,但是可以具有由空格分开的多个引用。
<!ELEMENT 家庭(人+)>
<!ELEMENT 人 EMPTY>
<!ATTLIST 人
relID ID #REQUIRED
paraentID IDREFS #IMPLIED
name CDATA #REQUIRED
>
<家庭>
<人 relID="P_1" name="爸爸"/>
<人 relID="P_2" name="妈妈"/>
<人 relID="P_3" parentID="P_1 P_2" name="儿子"/>
</家庭>
(4)属性类型-Enumerated,事先定义好一些值,属性的值必须在所列出的值的范围内。
<!ATTLIST student
性别(男|女) #REQUIRED
>
4、实体定义
实体定义:
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。
4.1引用实体
引用实体主要在XML文档中被应用
语法格式如下,引用实体的定义内容最好放在DTD文件的最后
<!ENTITY实体名称 "实体内容">
引用方式:
&实体名称;
<!ENTITY identity "I am a student">
....
&identity;
注:引用实体事末尾带分号
4.2参数实体
参数实体被DTD文件自身使用
语法格式为:
<!ENTITY % 实体名称 "实体内容">
引用方式为:
%实体名称
<!ENTITY %TAG_NAME "姓名|EMAIL|电话|地址">
<!ELEMENT 个人信息 (%TAG_NAME;|生日)>
<!ELEMENT 学生信息 (%TAG_NAME;|学校)>
5、验证
https://www.w3cschool.cn/xml/xml-validator.html