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

XML文档约束之——文档类型定义DTD

程序员文章站 2022-07-09 09:02:06
...

文档类型定义(DTD):是一种将约束置于XML文档上的方法。

一个DTD例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE games[
<!ELEMENT games (game*)>
<!ELEMENT game (#PCDATE)>
]>
<games>
  <game> i am lulu </game>
</games>



1.这个DTD有两个元素类型声明,由<!ELEMENT>指定。
2.DTD可以用来描述元素、每个元素包含几个子元素、元素在文档中的次序。
3.DTD还能够为元素的属性提供约束信息
4.但是,DTD不是必须的,只是为了XML指定约束时,提供的标准机制。




简述指定DTD语法

1.<!DOCTYPE>来指定XML文档使用的DTD
例:
<!DOCTYPE root SYSTEM "uri">

其中,
root来知道该DTD属于哪个文档,即必须与“根元素”匹配;
SYSTEM来表明此DTD是私有的,一般用于外部的DTD;
uri当使用外部DTD时,来指定其位置。


2.外部的DTD
即DTD的相关内容在XML文本外
例:
a.可以是一个完整的URL:
<!DOCTYPE root SYSTEM "http://www.xmlgames.com.games.dtd">

b.如果XML文档和DTD在同一个物理位置,那也可以是一个简单的文件名:
<!DOCTYPE root SYSTEM "games.dtd">


3.内部的DTD
即之前的第一个小例子

4. 元素声明
元素声明包括:声明的起始标记、声明的元素名称、指定元素的内容(可指定为EMPTY,ANY,Mixed,children)

<!ELEMENT games EMPTY>
表明元素的内容可以为空或者不包含任何值.

<!ELEMENT games ANY>
表明元素可以编写为包含普通的元素和字符数据.

<!ELEMENT game (game,#PCDATE)>
Mixed不是一个真正的值,可以表示该元素包含已经解析的字符数据和子元素;
其中,#PCDATE表示该元素必须包含“字符数据的子元素”;
Mixed不能指定子元素的顺序和出现次数.

<!ELEMENT games (game1,game2)>
children不是一个真正的值,表明该元素包含子元素并且为其指定了名称和出现次序.

<?xml version="1.0" encoding="UTF-8"?>
<games>
  <game>
     <game1/>
     <game2/>
  </game>
</games>



<!ELEMENT games (game1 | game2)>  

<?xml version="1.0" encoding="UTF-8"?>
<games>
  <game>
     <game1/>
     </game>
</games>



<!ELEMENT games (#PCDATE)>

<?xml version="1.0" encoding="UTF-8"?>
<games>
  <game>
     i am lulu
  </game>
</games>



5.元素的出现次数
无   子元素只能出现一次
?   子元素出现0次或1次
*   子元素出现0次或多次
+   子元素出现1次或多次

例:
<!ELEMENT games (game*)>中game元素可以出现0次或者多次

6.元素的出现顺序
(,)表示元素按指定顺序出现
(|)表示可以按任意顺序出现,并且只有一个是必需的

7.属性列表声明
<!ATTLIST 元素名 属性名 类型  默认值>
a.类型:一般是CDATA,代表不是标记的字符数据
b.默认值:#REQUIRED(属性是必需的,且只有一个值)
           #IMPLIED (属性不是必需的,且无值)
           #FIXED(属性是必需的,且有指定的值)

例:为元素game声明了两个属性name1和name2
<!ATTLIST game name1 CDATA  #REQUIRED
               name2 CDATA  #IMPLIED
               name3 CDATA  #FIXIED “lulu”>