我们要写出格式良好的XML文档,就需要对XML文档进行格式验证。目前验证XML文档的格式验证有两种方式:DTD和Schema。
DTD(Document Type Definition) 是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。DTD 是一种保证XML文档格式正确的有效方法,可通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能成为数据交换标准,因为不同的公司只需定义好标准DTD,各公司都能依DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。DTD文件是一个ASCII文本文件,后缀名为.dtd。
这里我们通过一个实例,对DTD的使用方法进行了解。
<?xml version="1.0" encoding="UTF-8"?>
<!--
DTD中的元素(ELEMENT):?表示0次或1次,*表示0次或多次,+表示一次或多次,默认为1次
|:表示枚举的元素至少出现一种
DTD中元素的属性(ATTLIST):
属性类型:CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
属性参数:
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
-->
<!DOCTYPE students [
<!ELEMENT students (student+)>
<!ELEMENT student (name, sex?, (age|birthday)?,course+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT hobby (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ATTLIST student id ID #REQUIRED>
<!ATTLIST student sex CDATA #IMPLIED>
<!ATTLIST student valid CDATA #FIXED "1">
<!ATTLIST course cid (YW|SX|YY|WL|HX) "YW">
]>
<students>
<student id="s1" valid="1">
<name>张三</name>
<sex>男</sex>
<course cid="HX">化学</course>
</student>
<student id="s2" sex="男">
<name>李四</name>
<birthday>1993-02-29</birthday>
<course cid="YY">英语</course>
</student>
<student id="s3">
<name>小红</name>
<sex>女</sex>
<age>19</age>
<course cid="YW">语文</course>
</student>
</students>
通常情况下,我们需要将XML内容和验证分开。
1.新建stu.dtd,将XML文档验证的代码移入该文件:
<?xml version="1.0" encoding="UTF-8"?>
<!--
DTD中的元素(ELEMENT):?表示0次或1次,*表示0次或多次,+表示一次或多次,默认为1次
|:表示枚举的元素至少出现一种
DTD中元素的属性(ATTLIST):
属性类型:CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
属性参数:
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
-->
<!ELEMENT students (student+)>
<!ELEMENT student (name, sex?, (age|birthday)?,course+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT hobby (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ATTLIST student id ID #REQUIRED>
<!ATTLIST student sex CDATA #IMPLIED>
<!ATTLIST student valid CDATA #FIXED "1">
<!ATTLIST course cid (YW|SX|YY|WL|HX) "YW">
2.在同一个目录下新建stu.xml,将XML文档内容代码移入该文件,并引入DTD验证文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE students SYSTEM "stu.dtd">
<students>
<student id="s1" valid="1">
<name>张三</name>
<sex>男</sex>
<course cid="HX">化学</course>
</student>
<student id="s2" sex="男">
<name>李四</name>
<birthday>1993-02-29</birthday>
<course cid="YY">英语</course>
</student>
<student id="s3">
<name>小红</name>
<sex>女</sex>
<age>19</age>
<course cid="YW">语文</course>
</student>
</students>