1、编写dtd
DTD的目的:
验证该xml文档是否是有效的xml文档
如果一个良构的xml文档满足了DTD的声明就是一个有效的xml文档。
注意:良构 不一定 有效,但是有效一定良构
DTD对xml文件中元素的约束:
格式:<!ELEMENT 元素名 (内容模式)>
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA|id|name|age)*>
内容模式:
empty
(1).EMPTY:元素不能包含子元素和文本(空元素)
例如:
dtd文件:
<!ELEMENT students (stu)>
<!ELEMENT stu EMPTY>
xml文件:
<students>
<!--这个stu元素中的内容必须为空-->
<stu></stu>
</students>
(2).(#PCDATA):可以包含任何字符数据,但是不能在其中包含任何子元素
例如:
dtd文件:
<!ELEMENT students (stu)>
<!ELEMENT stu (#PCDATA)>
xml文件:
<students>
<stu>mary</stu>
</students>
(3).ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
例如:
dtd文件:
<!ELEMENT students (stu)>
<!ELEMENT stu ANY>
xml文件:
<students>
<stu>mary</stu>
</students>
或者
<students>
<stu>
<name>mary</name>
</stu>
</students>
(4). 修饰符:() | + * ? ,
() 用来给元素分用组
| 在列出的元素中选择一个
+表示该元素最少出现一次,可以出现多次 (1或n次)
*表示该元素允许出现零次到任意多次(0到n次)
?表示该元素可以出现,但只能出现一次 (0到1次)
,对象必须按指定的顺序出现
属性约束:
<!ATTLIST 元素名称
属性名称 值类型 属性特点
属性名称 值类型 属性特点
>
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA)>
<!ATTLIST stu
id CDATA #REQUIRED
name CDATA #REQUIRED
>
1、值类型:
(1).CDATA:属性值可以是任何字符(包括数字和中文)
(2).ID:属性值必须唯一,属性值必须满足xml命名规则
(3).IDREF/IDREFS
IDREF属性的值指向文档中其它地方声明的ID类型的值。
IDREFS同IDREF,但是可以具有由空格分开的多个引用。
(4).enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
例如:
dtd文件:
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA)>
<!ATTLIST stu
id ID #REQUIRED
name CDATA #REQUIRED
gender (male|sex) #REQUIRED
>
2、属性特点:
(1).#REQUIRED:元素的所有实例都必须有该属性
例如:
dtd文件:
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA)>
<!ATTLIST stu
name CDATA #REQUIRED
>
xml文件:
<students>
<stu name=""></stu>
<stu name="mary"></stu>
</students>
注意:
1. name属性必须出现
2. name属性的值可以为空也可以不为空
(2).#IMPLIED :属性可以不出现
例如:
dtd文件:
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA)>
<!ATTLIST stu
name CDATA #IMPLIED
>
xml文件:
<students>
<stu name=""></stu>
<stu name="tom"></stu>
<stu></stu>
</students>
注意:
1. name属性可以出现也可以不出现
2. name属性的值可以为空也可以不为空
(3).default-value:属性可以不出现,并且当它不出现的时候是有默认值的,而该属性的默认值就是atttibute-value
例如:
dtd文件:
<!ELEMENT students (stu*)>
<!ELEMENT stu (#PCDATA)>
<!ATTLIST stu
name CDATA "mary"
>
xml文件:
<students>
<stu name="哈士奇"></stu>
<stu></stu>
</students>
注意:
1. name属性可以出现也可以不出现
2. name属性如果不出现则默认值为mary
(4).#FIXED :属性可以不出现,但是如果出现的话必须是指定的属性值
例如:
dtd文件:
<!ELEMENT students (stus*)>
<!ELEMENT stus (#PCDATA)>
<!ATTLIST stus
year CDATA #IMPLIED
company CDATA #FIXED "briup"
>
xml文件:
<students>
<stus school="briup"></stus>
<stus></stus>
</students>
注意:
1. year/company属性可以出现也可以不出现
2. company属性如果出现那么值一定要是briup