使用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子元素,有或没有subtitleDTD以元素、实体、属性和记号的标记声明来做到这一点。

 

三、 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>是文档或基本元素。

 

带有DTDxml文档示例:

<?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 元素有四个元素:"tofromheading,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 来验证 XMLFirefox, Mozilla, Netscape 以及 Opera 做不到这一点。

 

 

 

课堂练习:

1.      根据XML文件写DTD

下面是一个管理学生信息的XML文档,请写出对应的DTD文档,并对XML文档进行有效性验证

2.      根据DTDXML文件

阅读下面的DTD文档声明,写出相应的XML文档,并进行有效性验证。要求:数据自拟,包含一名男生和一名女生。


 

 


以上是关于使用DTD验证XML的主要内容,如果未能解决你的问题,请参考以下文章

xmllint:如何使用本地 DTD 文件验证 XML

java - 如何将本地DTD文件的验证应用于java中的xml文件?

使用 Java 针对本地 DTD 文件验证 XML 文件

XML :: LibXML无法通过HTTPS验证可用的DTD

如何在 Python 中针对 DTD 文件验证 xml

DTD验证XML文档