使用DTD验证XML
Posted 国土飞扬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用DTD验证XML相关的知识,希望对你有一定的参考价值。
第2章 使用DTD验证XML
一、XML验证简介
1、 形式良好的XML文档
形式良好的XML文档拥有正确的语法:
XML文档必须有一个根元素
Xml元素都必须有一个关闭标签
Xml标签对大小敏感
Xml属性值必须加引号
2、 验证XML
合法的xml文档是“形式良好”的XML文档。DTD的目的是定义XML的文档结构,它使用一系列合法的元素来定义文档结构。
3、 验证XML的方式
验证XML的方式一:DTD
一个合法的 XML 文档是"形式良好"的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则:
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </note> |
验证XML的方式二: Schema
二、使用DTD验证XML
DTD为英文 Document Type Definition,中文意思是“文档类型定义”。
DTD 为文档结构制定了一套规则。例如,一项 DTD指定一个 BOOK 元素有一个 ISBN 子元素、一个 TITLE子元素、一个或多个author子元素,有或没有subtitle。DTD以元素、实体、属性和记号的标记声明来做到这一点。
三、 DTD的应用
DTD可以被成行的声明于XML文档中,也可以作为一个外部引用。
1、 内部DTD
通过下面的语法包装在DOCTYPE声明中:
<!DOCTYPE 根元素名[ 元素描述 ]> 文件体 |
<?xml version="1.0" standalone="yes"?> <!DOCTYPE GREETING [ <!ELEMENT GREETING (#PCDATA)> ]> <GREETING> Hello XML! </GREETING> |
在本例中,<?xmlversion="1.0"standalone="yes"?>是 XML 声明;<!DOCTYPE GREETING[ <!ELEMENT GREETING (#PCDATA)> ]>是文档类型声明;<!ELEMENT GREETING(#PCDATA)>是文档类型定义;<GREETING> Hello XML!</GREETING>是文档或基本元素。
带有DTD的xml文档示例:
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </note> |
以上 DTD 解释如下:
!DOCTYPEnote (第二行)定义此文档是 note 类型的文档。
!ELEMENTnote (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENTto (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENTfrom (第五行)定义 frome 元素为 "#PCDATA" 类型
!ELEMENTheading (第五行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第五行)定义 body 元素为 "#PCDATA" 类型
2、 外部DTD
如果DTD位于XML源文件的外部,它可以通过下面的语法被封装在一个
外部DTD的好处是:它可以方便高效的被多个XML文件所共享。
这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> |
这是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> |
3、 为什么要使用DTD?
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
四、Xml文档构建模块
1. 所有的xml文档(以及html文档)均由以下简单的构建模块构成
² 元素
² 属性
² 实体
² PCDATA
² CDATA
2. 元素声明
语法:
<!ELEMENTname content>
ELEMENT:关键字
Name:元素名称
Content:元素类型
EMPTY:该元素不能包含子元素和文本,但可以有属性
ANY:该元素可以包含任何在DTD中定义的元素内容
#PCDATA:可以包含任何字符数据,但是不能在其中包含任何子元素
纯元素类型:只包含子元素,并且这些子元素外没有文本
混合类型:包含子元素和文本数据的混合体
示例:
<?xml version="1.0" encoding="UTF-8"?> <!ELEMENT student (sname+, sex*, age)> <!ELEMENT sname EMPTY> <!ELEMENT sex (#PCDATA)> <!ELEMENT age (#PCDATA)> |
3. 属性声明
属性声明的语法:
<!ATTLIST 元素名称 属性名称 属性类型 属性约束 默认值 >
属性类型:
CDATA:表示属性的值是一个普通的字符串
ENUMERATED:属性的值是一个枚举列表中的值
ID:表明属性的值在整个文档中都是唯一的,如果有重复的ID则校验不通过。ID属性的值只能由字母、下划线开始,不能使用数字、不能使用空白字符。
属性约束:
#REQUIRED:必须设置该属性
#IMPLIED:可以设置也可以不设置
#FIXED:说明该属性的值固定为一个值,在XML文件中不能为它设置其他值,在使用该元素时无需为其分配该属性,XML处理器会自动给属性增加固定值
示例:
<!ATTLIST stuname firstname CDATA #REQUIRED>
<!ATTLIST 学生 状态 CDATA #FIXED “在读” >
<!ATTLIST studentstustate CDATA "在读">
4. 实体声明
<!ENTITY>就是对一大段内容的引用,可以简化代码的复用
声明实体的语法:
<!ENTITY 实体名称 “实体的值”>
示例:
<!ENTITY writer “湖北国土资源职业学院-小明”>
实体的引用:
<class>&writer;</class>
在网页上显示的时候显示的就是实体存储的值
五、元素多层嵌套的例子
DTD
<?xmlversion="1.0" encoding="UTF-8"?>
<!ELEMENT 一个班 (学生+)>
<!ELEMENT 学生 (姓名,年龄,性别) >
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
1.XML
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPE 一个班 SYSTEM "1.dtd">
<一个班>
<学生>
<姓名>八戒</姓名>
<年龄>22</年龄>
<性别>男</性别>
</学生>
<学生>
<姓名>悟空</姓名>
<年龄>33</年龄>
<性别>男</性别>
</学生>
</一个班>
六、 外部DTD示例
1.创建外部DTD文件
2. 将外部DTD文件引入到XML文件中
注释:只有在 InternetExplorer 中,可以根据 DTD 来验证 XML。Firefox, Mozilla, Netscape 以及 Opera 做不到这一点。
课堂练习:
1. 根据XML文件写DTD
下面是一个管理学生信息的XML文档,请写出对应的DTD文档,并对XML文档进行有效性验证
2. 根据DTD写XML文件
阅读下面的DTD文档声明,写出相应的XML文档,并进行有效性验证。要求:数据自拟,包含一名男生和一名女生。
以上是关于使用DTD验证XML的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何将本地DTD文件的验证应用于java中的xml文件?