【XML学习笔记】2:XML中的DTD(文档类型定义)
简述
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,其它浏览器不会这样做。
上一篇: java连接mysql遇到的问题
下一篇: XML DTD 文档类型定义