XML文档使用DTD进行限制,DTD必须对所有标签进行限制,但是标签的子标签通过特殊字符可以不进行编写。
案例:
DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。
即可以通过引用地址来使用DTD文件,例如果想告诉10个人约束文档,那么就通过建立一个DTD文件来发给他们,让他们自己引用。
在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:
<!ELEMENT 元素名称 元素类型>
元素类型可以是元素内容、或类型
•如为元素内容:则需要使用()括起来,如
<!ELEMENT 书架 (书名,作者,售价)> 括号里面的是属性,即子标签,只包含子元素
<!ELEMENT 书名 (#PCDATA)> #PCDATA :代表文本类型,但不能在其中包含任何子元素
•如为元素类型,则直接书写,DTD规范定义了如下几种类型:
•EMPTY:用于定义空元素,例如<br/> <hr/>
•ANY:表示元素内容为任意类型。
元素内容中可以使用如下方式,描述内容的组成关系
•用逗号分隔,表示内容的出现顺序必须与声明时一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>
• 用|分隔,表示任选其一,即多个只能出现一个
<!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>
在元素内容中也可以使用+、*、?等符号表示元素出现的次数:
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
. :对象必须按照指定的顺序出现
| :在列出的对象选择一个,表示括号中的内容必须出现一个。
( ):用来给元素分组
将这4个标签分为2部分,并且选择其一必须出现。
例 <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
例如//记得空格也是很重要的分割部分,语法一定要正确
<?xml version="1.0" encoding="GB2312"?>
<!ELEMENT socres [
<!ELEMENT socres (student*)>//括号里是子标签,但是由于有多个相同的标签,所以使用*号
<!ELEMENT student(name,course,score)>//由于名为student的子标签有两个,但他们的属性并不一定相同,但是所有的属性都是要写到DTD里的,
例如我在第一个student标签中加一个age子标签,但是第二个并不需要用,那么就可以使用 (name,course,score,age*)或者
(name,course,score,age?)(这里是因为只有两个子标签,并且只使用一个age) 都可以。
<!ELEMENT name (#PCDATA)> //name子标签里没有其他子元素,只有文本,所以使用(#PCDATA)。如果前面加了age子标签就需要加一个<!ELEMENT age (对应内容)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
上面代码就是对应下面XML文件的DTD代码,如果单写DTD文件不用带<!ELEMENT socres [>该标签
<?xml version="1.0" encoding="GB2312"?>//开头
-<scores>//根标签只有一个。 想象成一个对象的集合
-<student id="1"> //从这里一直到该标签结束可以理解为一个对象
<name>王同</name> //对象的内容,相当于输出
<course>java</course>//对象的内容,相当于输出
<score>89</score>//对象的内容,相当于输出
</student>//对象结尾
-<student id="2">
<name>李佳</name>
<course>sql</course>
<score>58</score>
</student>
</scores>