前面一篇文章,我们会这个books的xml结构就行。这看起来xml语法也很随意,什么都可以写,那么有时候,我们需要的xml文件内容是有一定要求和约束的,这个时候我们就需要对xml进行约束,本篇就来学习xml约束之一的DTD方式。
1.DTD分类和语法
DTD分类:
*内部dtd,在xml内部定义dtd
*外部dtd:在外部文件中定义dtd
*本地dtd文件:<!DOCTYPE students SYSTEM "student.dtd">
*网络dtd文件:<!DOCTYPE students PUBLIC “名称空间”"student.dtd">
这个语法,这里先看不懂没关系,下面我们结合约束文件和xml内容就容易明白。
2.先准备一个student.dtd文件
我在src下新建一个com.anthony.dtd的包,然后创建一个student.dtd文件,写入下面内容。
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,gender)>
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT gender (#PCDATA) >
<!ATTLIST student number ID #REQUIRED>
3.写一个带约束的xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="s001">
<name>ZS</name>
<age>18</age>
<gender>male</gender>
</student>
</students>
4.解释约束含义
<!ELEMENT students (student*)>
// 第一行是根元素,这个元素叫students,小括号里面的意思是 这个根元素下有0到多个student的子元素
<!ELEMENT student (name,age,gender)>
// 元素student 下有三个嵌套元素 分别是 name, age, gender, 少写一个都不行,而且顺序是name->age->gender
<!ELEMENT name (#PCDATA) >
// 元素 name的值是PCDATA,理解为字符串就行
<!ELEMENT age (#PCDATA) >
<!ELEMENT gender (#PCDATA) >
<!ATTLIST student number ID #REQUIRED>
// ATTLIST 是属性列表的意思, 元素student 有一个属性叫number, ID表示number的值是唯一,不可以重复, REQUIRED是必须的意思。
你可以在你环境上,修改dtd文件内容,然后去修改xml文件内容,看看会不会报错。例如,把元素student的属性number去除。
1.删除number这个必须属性就会报错
2.这里我把gender元素改成sex也会报错
其他不符合本地dtd约束的错误就不举例了,其实dtd还是有缺陷,例如sex性别,我们要不是男就是女,但是这里dtd只能约束是字符串就行,下一篇,我们学习schema来解决这个精确约束的问题。