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>