dtd快速入门
创建dtd文件对上一篇的XML代码进行约束,代码如下,文件名为Demo1.dtd
1 <!ELEMENT person (name,age)>
2 <!ELEMENT name (#PCDATA)>
3 <!ELEMENT age (#PCDATA)>
上面的XML代码修改为
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE person SYSTEM "Demo1.dtd"> //加入了这句
3 <person>
4 <name>张三</name>
5 <age>23</age>
6
7 </person>
需要注意的地方:
约束在浏览器中打开不起作用,因为浏览器只负责校验XML语法,不负责校验约束,所以我们需要用到工具,我用的是myeclipse2017。
创建java项目,将xml文件和dtb文件都放到src下即可实现校验
dtd的三种引入方式
(1)引入外部dtd文件(即上面用到的)
<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
(2)使用内部的dtd文件
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE person [
3 <!ELEMENT person (name,age)>
4 <!ELEMENT name (#PCDATA)>
5 <!ELEMENT age (#PCDATA)>
6 ]>
7
8 <person>
9 <name>张三</name>
10 <age>23</age>
11 </person>
(3)使用外部的dtd文件
<!DOCTYPE 根元素 PUBLIC "dtd文件名称" "网络路径">
使用dtd定义元素
* 语法: <!ELEMENT 元素名 约束>
* 简单元素 :没有子元素的元素
<!ELEMENT name (#PCDATA)>
*** (#PCDATA):约束name是字符串
*** EMPTY : 元素为空
*** ANY: 任意
* 复杂元素
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>
声明多个元素只能出现其中一个
<!ELEMENT 元素名称 (子元素名称1 | 子元素名称2)>
dtd属性
语法
<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
示例
<!ATTLIST birthday ID1 CDATA #REQUIRED>
表示的事birthday的ID1这个属性为字符数据,而且属性值是必须出现的
下面两个表格分别对应了属性类型及约束
实体的定义
语法:
<!ENTITY 实体名称 "实体的值">
示例:
<!ENTITY writer "Bill Gates">
使用实体:
<author>&writer;</author>
注意一般实体定义写在内部dtd里,因为外部dtd在某些浏览器下不支持
外部定义格式为:
<!ENTITY 实体名称 SYSTEM "URI/URL">
案例演练
下面是w3cSchool上的一个实例
电视节目表 DTD
<!DOCTYPE TVSCHEDULE [ <!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)> <!ELEMENT HOLIDAY (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)> <!ELEMENT TIME (#PCDATA)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED> <!ATTLIST CHANNEL CHAN CDATA #REQUIRED> <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED> <!ATTLIST TITLE RATING CDATA #IMPLIED> <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED> ]>
当我们可以对照这敲出对应的XML代码,就说明我们基本掌握了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE [
<!ELEMENT TVSCHEDULE (CHANNEL+)>
<!ELEMENT CHANNEL (BANNER,DAY+)>
<!ELEMENT BANNER (#PCDATA)>
<!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
<!ELEMENT HOLIDAY (#PCDATA)>
<!ELEMENT DATE (#PCDATA)>
<!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
<!ELEMENT TIME (#PCDATA)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
<!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
<!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
<!ATTLIST TITLE RATING CDATA #IMPLIED>
<!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
]>
<TVSCHEDULE NAME="CCTV">
<CHANNEL CHAN="AAA">
<BANNER>HHHH</BANNER>
<DAY>
<DATE>2018-7-26</DATE>
<HOLIDAY>556</HOLIDAY>
<PROGRAMSLOT VTR="saklda">
<TIME>12-23</TIME>
<TITLE>hello</TITLE>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
</TVSCHEDULE>