DTD学习总结


一、DTD介绍

Document Type Definition;

DTD是一种XML的约束方式,除了此种约束方式外,还有XSchema,XSchema比DTD的约束能力还要强,因此DTD正在逐渐淘汰;

DTD的目的就是约束XML标签的写法;比如在我们struts2开发当中,编写struts.xml时,需要遵循

<struts>

<package name="" namespace="" extends="">

<action>

</action>

</package>

</struts>

的规则,就是通过DTD进行约束的,因此我们在开发当中通过Eclipse导入DTD文件,便于开发提示,如果在开发中开发人员不遵循DTD的规范,则会出现错误提示;

XML约束的重要性:在编写XML时,对于XML进行约束是非常重要的,因为如果对于XML不约束,则会让开发人员很难掌握;

而DTD通常是由框架设计人员定义的,一般的开发人员只需要在XML中遵循DTD规范编写XML即可;

二、导入DTD

如果要导入DTD,可以通过两种方式:

(1)在XML中直接编写;

(2)在专门的DTD文件中编写,然后在XML中通过特定的语句导入DTD文件;

1、在XML中直接编写

语法如下:

<!DOCTYPE 根节点[ ......... ]>

2.XML文件中导入DTD文件

此种方式需要考虑两个情况:

(1)如果是本地文件,则:

<!DOCTYPE 根节点 SYSTEM "dtd的URL">

此处的URL指的是比如 "F:\1.dtd"

(2)如果是共享文件,则:

<!DOCTYPE 根节点 PUBLIC "dtd名称" "dtd的URL">

三、DTD语法

在DTD中可以定义XML标签的顺序、个数,属性的值,实体;

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,表示字符串;

举例:

<!DOCTYPE personlist [ <!-- 根节点为personlist--> <!ELEMENT personlist (person+)> <!-- personlist的子元素为person,并且可以出现1次或多次--> <!ELEMENT person (name,age,salary)> <!-- person的子元素是name,age,salary,并且可以出现一次,并且出现顺序以此顺序为准--> <!ELEMENT name ANY> <!--name可以使任意类型 --> <!ELEMENT age (#PCDATA)> <!-- age可以是字符串--> <!ELEMENT salary (#PCDATA)> <!-- salary可以是字符串--> ]>

从以上可以看出,DTD不可以定义数字等类型,此为DTD的缺陷;

2.XML属性定义

语法如下:

<!ATTLIST 标签名

属性名1属性类型属性说明

属性名2属性类型属性说明

>

属性类型可以是

(1)CDATA:最普通的字符串;

(2)枚举,即(值1|值2|值3),需要括号

(3)ID:属性值需要以字母或下划线开头;

属性说明可以是:

(1)#REQUIRED:必须设置;

(2)#IMPLED:可选值,即此属性可以设置,也可以不设置;

(3)#FIXED:固定值,通常语法为:#FIXED "固定值"

(4)默认值;

举例:

<!DOCTYPE personlist [ <!ELEMENT personlist (person+)> <!ELEMENT person (name,age,salary)> <!ELEMENT name ANY> <!ELEMENT age (#PCDATA)> <!ELEMENT salary (#PCDATA)> <!ATTLIST person aaa CDATA #REQUIRED <!-- --> bbb CDATA #IMPLIED <!-- 可选属性--> ccc CDATA #FIXED "xiazdong" <!--固定值,不需要设置 --> ddd CDATA "XZDONG" <!--默认值为"XZDONG", 可以自己设置 --> eee ID #REQUIRED <!--ID --> fff (1|2|3) "1" <!--枚举值,默认为1 --> > ]>

3、XML实体定义

实体类似于一个可重用常量,或者说是ant中的classpath,可以被引用;

语法如下:

<!ENTITY 实体名称 "实体内容">

引用实体语法:
&实体名称; 注意:最后的“;”一定需要;

注意:引用实体必须在XML中引用;

举例:

<!DOCTYPE personlist [ <!ENTITY constant "aaaa"> <!ELEMENT personlist (person+)> <!ELEMENT person (name,age,salary)> <!ELEMENT name ANY> <!ELEMENT age (#PCDATA)> <!ELEMENT salary (#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;

-O dtd表示输出为dtd文件;

input.xml表示输入文件;

output.dtd表示输出文件;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值