欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【XML学习笔记】2:XML中的DTD(文档类型定义)

程序员文章站 2022-05-30 12:29:39
...

简述

XML中的DTD定义了本XML文档中的合法构建模块,之前经常有接触到的<!DOCTYPE......>就是DTD的声明。DTD可以直接写在XML文档内:

<!DOCTYPE 根元素名 [
多行的DOCTYPE声明
......
]>

也可以放在外部被本XML文件引用:

<!DOCTYPE 根元素名 SYSTEM "外部DTD文件">

元素声明

元素即是XML中尖括号括起来的主体,元素可以具有属性(属性=”属性值”放在开始标签中),也可以具有(双标签闭合起来的东西),对于没有值的元素用一个\将其闭合,如<br\>

DTD中用<!ELEMENT 元素名 其它>的格式声明一个元素及其约束信息。runoob上总结了各种不同的约束。

①空元素:如<br\><!ELEMENT br EMPTY>指明。

②只有PCDATA的元素:PCDATA是指被解析的字符数据(Parsed Character DATA),如<!ELEMENT 元素名 (#PCDATA)>,关于PCDATA具体的后面再学。

③内容任意的元素:<!ELEMENT 元素名 ANY>

④有嵌套子元素的元素:<!ELEMENT 元素名 (子元素1,子元素2,...)>,子元素的顺序必须和文档中出现的顺序一致,子元素也要另外被声明。

⑤只出现一次的元素:<!ELEMENT 出现在的父元素名 (元素名)>,根元素只出现一次,显然是没必要也没办法写进这个声明里了。

⑥最少出现一次的元素:<!ELEMENT 出现在的父元素名 (元素名+)>,这个元素声明相比上面那个,需要在父元素中出现1到多次。

⑦在父元素内出现任意次的元素:<!ELEMENT 出现在的父元素名 (元素名*)>,和正则一样的套路,这个元素需要在父元素中出现0到多次。

⑧具有对抗关系的元素:如<!ELEMENT note (to,from,header,(message|body))>中的message或body将在header元素之后作为note元素的子元素。注意这里的或是非此即彼的,即两个必须且只能取一个。

属性声明

DTD中用<!ATTLIST 属性所在元素名 属性名 属性类型 属性值约束>的格式声明一个属性并约束其所在元素和属性值。

其中,属性值约束可以是一个具体的值,这时表示这个值将作为不指名属性时的默认值。这个字段还可以取#REQUIRED表示属性值必须显示指明,#IMPLIED表示属性值不是必须的(不指名也就没有),#FIXED 值表示属性值将严格取这个固定值。

其前一字段属性类型可以有多种取值,摘下了runoob上的表:

属性类型 描述
CDATA 值为字符数据(Character DATA)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的id
IDREF 值为另外一个元素的id
IDREFS 值为其他id的列表
NMTOKEN 值为合法的XML名称
NMTOKENS 值为合法的XML名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的XML值

实体声明

前面接触过XML/HTML的字符实体,实体总是由&开头并以;结尾,自己声明的实体也不例外,可以将实体看成一种宏定义,它将在XML解析时被替换成所引用的普通文本或特殊字符。

实体声明的语法是<!ENTITY 实体名 "要替换成的值">,在解析时&实体名;将被替换成要替换成的值

还可以用<!ENTITY 实体名 SYSTEM "外部实体URL">将外部DTD文件引入为这个实体。

DTD和XML验证器

网上的那些XML验证器除了单纯的验证是不是一个规范的XML之外,还会根据写的DTD头来验证后面的XML是不是符合这个DTD规范的,这是DTD在制定XML书写规则时一个重要的作用。

另外,只有IE浏览器会根据DTD去验证XML,其它浏览器不会这样做。

相关标签: XML DTD