一、DTD介绍
Document Type Definition;
DTD是一种XML的约束方式,除了此种约束方式外,还有XSchema,XSchema比DTD的约束能力还要强,因此DTD正在逐渐淘汰;
DTD的目的就是约束XML标签的写法;比如在我们struts2开发当中,编写struts.xml时,需要遵循的规则,就是通过DTD进行约束的,因此我们在开发当中通过Eclipse导入DTD文件,便于开发提示,如果在开发中开发人员不遵循DTD的规范,则会出现错误提示;
<struts> <package name="" namespace="" extends=""> <action> </action> </package> </struts>
XML约束的重要性:在编写XML时,对于XML进行约束是非常重要的,因为如果对于XML不约束,则会让开发人员很难掌握;
而DTD通常是由框架设计人员定义的,一般的开发人员只需要在XML中遵循DTD规范编写XML即可;
二、导入DTD
如果要导入DTD,可以通过两种方式:
(1)在XML中直接编写;
(2)在专门的DTD文件中编写,然后在XML中通过特定的语句导入DTD文件;
1、在XML中直接编写,语法如下:
- <!DOCTYPE根节点[
- .........
- ]>
此种方式需要考虑两个情况:
(1)如果是本地文件,则:
- <!DOCTYPE根节点SYSTEM"dtd的URL">
此处的URL指的是比如 "F:\1.dtd"
(2)如果是共享文件,则:
- <!DOCTYPE根节点PUBLIC"dtd名称""dtd的URL">
三、DTD语法
1.XML元素定义
语法如下:
<!ELEMENT 元素名称 元素类型>//定义元素的类型,但是只能是 ANY(表示任意类型)或EMPTY(空元素);
<!ELEMENT 元素名称 (元素内容)>//定义元素的内容,一定要加上();
对于元素内容,
----可以定义子元素的名称,比如:
<!ELEMENT 元素名称 (子元素1,子元素2,子元素3)> 表示3个子元素只能出现一次,并且按照此顺序出现;
<!ELEMENT 元素名称 (子元素1|子元素2|子元素3)> 表示3个子元素中只能出现一个;
我们还可以定义子元素的个数,比如:
(1)+:1次或多次;比如 (name+)表示此name元素只能出现1次或多次。
(2)?:0次或1次;比如(name?)表示此name元素只能出现0次或1次。
(3)*:0次或多次;比如(name*)表示此name元素任意出现几次。
(4)无:只能一次;比如(name)表示此name元素只能出现1次。
对于元素内容,
----也可以定义子元素内容的类型,比如#PCDATA,表示字符串;
举例:
- <!DOCTYPEpersonlist[<!--根节点为personlist-->
- <!ELEMENTpersonlist(person+)><!--personlist的子元素为person,并且可以出现1次或多次-->
- <!ELEMENTperson(name,age,salary)><!--person的子元素是name,age,salary,并且可以出现一次,并且出现顺序以此顺序为准-->
- <!ELEMENTnameANY><!--name可以使任意类型-->
- <!ELEMENTage(#PCDATA)><!--age可以是字符串-->
- <!ELEMENTsalary(#PCDATA)><!--salary可以是字符串-->
- ]>
从以上可以看出,DTD不可以定义数字等类型,此为DTD的缺陷;
2.XML属性定义
语法如下:
<!ATTLIST 标签名
>
属性类型可以是
(1)CDATA:最普通的字符串;
(2)枚举,即(值1|值2|值3),需要括号
(3)ID:属性值需要以字母或下划线开头;
属性说明可以是:
(1)#required:必须设置;
(2)#IMPLED:可选值,即此属性可以设置,也可以不设置;
(3)#FIXED:固定值,通常语法为:#FIXED "固定值"
(4)默认值;
举例:
- <!DOCTYPEpersonlist[
- <!ELEMENTpersonlist(person+)>
- <!ELEMENTperson(name,salary)>
- <!ELEMENTnameANY>
- <!ELEMENTage(#PCDATA)>
- <!ELEMENTsalary(#PCDATA)>
- <!ATTLISTperson
- aaaCDATA#required<!---->
- bbbCDATA#IMPLIED<!--可选属性-->
- cccCDATA#FIXED"xiazdong"<!--固定值,不需要设置-->
- dddCDATA"XZDONG"<!--默认值为"XZDONG",可以自己设置-->
- eeeID#required<!--ID-->
- fff(1|2|3)"1"<!--枚举值,默认为1-->
- >
- ]>
3、XML实体定义
实体类似于一个可重用常量,或者说是ant中的classpath,可以被引用;
语法如下:
引用实体语法:
&实体名称; 注意:最后的“;”一定需要;
注意:引用实体必须在XML中引用;
举例:
- <!DOCTYPEpersonlist[
- <!ENTITYconstant"aaaa">
- <!ELEMENTpersonlist(person+)>
- <!ELEMENTperson(name,salary)>
- <!ELEMENTnameANY>
- <!ELEMENTage(#PCDATA)>
- <!ELEMENTsalary(#PCDATA)>
- ]>
- <personlist>
- <person>
- <name>&constant;</name><!--引用constant实体-->
- <age>aaa</age>
- <salary>aaa</salary>
- </person>
- </personlist>
小知识点:根据XML自动生成DTD
因为一般我们写的XML基本都是没有DTD的,如果要自己写DTD,又很麻烦,因此我们可以通过工具来自动生成:trang
功能:能够完成如下转换:
(1)XML ---> DTD
(2)XML --->XSchema
(3)DTD--->XSchema
使用方法:
java -jar trang.jar -I xml -O dtd input.xml output.dtd 即可;
-I xml 表示输入为xml;
input.xml表示输入文件;
原文链接:https://www.f2er.com/xml/297438.html