DTD验证XML
1.内部DTD
最简单的使用DTD的方法是在XML文件的序言部分加入一个DTD描述,加入的位置是紧接在XML处理指示之后。一个包含DTD的XML文件的结构为:
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 根元素名[
元素描述
]>
文件体.
一个完整的XML文件为:
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
]>
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
<联系人列表>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>zhang@aaa.com</EMAIL>
<电话>(010)62345678</电话>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
</地址>
</联系人>
<联系人>
<姓名>李四</姓名>
<ID>002</ID>
<公司>B公司</公司>
<EMAIL>li@bbb.org</EMAIL>
<电话>(021)87654321</电话>
<地址>
<街道>南京路9876号</街道>
<城市>上海市</城市>
<省份>上海</省份>
</地址>
</联系人>
</联系人列表>
2. 外部DTD
一个DTD既可以是内部的,包含在一个“形式良好的”XML文件中(standalone=“yes”);也可以是外部的,作为一个外部文件被引用(standalone=“no”)。
外部DTD的好处是:它可以方便高效地被多个XML文件所共享。你只要写一个DTD文件,就可以被多个XML文件所引用。事实上,当许多组织需要统一它们的数据交换格式时,它们就是通过外部DTD来完成的。这样做不仅简化了输入工作,还保证当你需要对DTD做出改动时,不用一一去改每个引用了它的XML文件,只要改一个公用的DTD文件就足够了.
为了引用一个外部DTD,必须修改XML声明和DOCTYPE声明。XML声明中必须说明这个文件不是自成一体的,即standalone属性的属性值不再是yes了。
<?xml version = "1.0"
encoding="GB2312"
standalone = "no"?>
在DOCTYPE声明中,应该加入SYSTEM属性:
<!DOCTYPE 根元素名
SYSTEM "外部DTD文件的URL">
例如:
<!DOCTYPE 联系人列表
SYSTEM "http://www.mydomain.com/dtds/fclml.dtd
">
上面的URL是一个绝对路径,除此以外,它还可以是一个相对路径,如:
<!DOCTYPE 联系人列表
SYSTEM "fclml.dtd">
它说明这个DTD文件和引用它的XML文件在同一个目录下。或者,这个DTD文件还可能在XML文件的父目录的子目录DTD下,表示为:
<!DOCTYPE 联系人列表
SYSTEM "../dtds/fclml.dtd">
使用这种方法,你可以方便地把DTD文件从你的XML文件中分离出来,粘贴到另一个文件fclml.dtd中。这样,你就得到一个DTD文件和一个有效的XML文件。
仍然回到前面那个包含客户联系方式信息的XML文件,如果使用外部DTD,其形式应该变为下面这个样子。DTD文件fclml.dtd:
<?xml version="1.0" encoding="GB2312"?>
<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)>
<!ELEMENT 地址 (街道,城市,省份)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT ID (#PCDATA)>
<!ELEMENT 公司 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ELEMENT 电话 (#PCDATA)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
XML文件client.xml:
<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 联系人列表
SYSTEM "fclml.dtd">
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
<联系人列表>
<联系人>
<姓名>张三</姓名>
<ID>001</ID>
<公司>A公司</公司>
<EMAIL>zhang@aaa.com</EMAIL>
<电话>(010)62345678</电话>
<地址>
<街道>五街1234号</街道>
<城市>北京市</城市>
<省份>北京</省份>
<ZIP>100001</ZIP>
</地址>
</联系人>
<联系人>
<姓名>李四</姓名>
<ID>002</ID>
<公司>B公司</公司>
<EMAIL>li@bbb.org</EMAIL>
<电话>(021)87654321</电话>
<地址>
<街道>南京路9876号</街道>
<城市>上海</城市>
<省份>上海</省份>
<ZIP>200002</ZIP>
</地址>
</联系人>
</联系人列表>
3. 公用DTD
使用外部DTD时,要在DOCTYPE中使用关键字SYSTEM。实际上,SYSTEM不是引用外部DTD的唯一方法,这个关键字主要用于引用一个作者或组织所编写的众多XML文件中通用的DTD。还存在一种外部DTD,它是一个由权威机构制订的,提供给特定行业或公众使用的DTD。因此,另一个引用外部DTD的办法是使用关键字PUBLIC,引用这一类公开给公众使用的DTD。
引用公共DTD的形式为:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "外部DTD的URL">
4.元素的定义
一个DTD不仅要告诉语法分析器它所关联的XML文件的根元素是什么,而且还要告诉语法分析器文件的内容和结构,说清文件结构中的每一个细节。为了定义这些细节,我们必须展开DTD中元素说明部分,使用元素类型声明(ETD)来声明所有有效的文件元素。ETD应该采用如下的结构:
<!ELEMENT 元素名 元素内容描述>
一个具体例子:
<?xml version = "1.0" encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
</联系人>
</联系人列表>
元素定义是由它们的元素内容模型(ECM)来描述的,也就是说,是由紧跟元素后面的括号中的内容来定义的。元字符的定义:
元 字 符
含 义
+ |
出现一次或多次 |
* |
出现零次或多次 |
? |
可选,不出现或出现一次 |
() |
一组要共同匹配的表达式 |
| |
OR,或 |
, |
AND,要求严格遵从顺序要求 |
元素A 元素B 元素C |
元素列表,无须遵从顺序要求 |
注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。因此,象下面这样定义的DTD是不合法的:
<!ELEMENT 联系人(姓名,电话|EMAIL)>
要想使用多种连接符,只有通过创建子组的方式,使用:
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
5.
元素的属性
在DTD中定义属性时,我们使用下面的格式:
<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
-
必须赋值的属性
关键字REQUIRED说明XML文件中必须为这个属性给出一个属性值。例如,假设你想定义一个"页面作者"元素,并把这个元素加入所有网站中的每一个页面。之所以定义这个元素,是为了页面编辑者能够提供他的联系信息,以便当发现页面错误或无效链接时,可以及时地通知他。在这种情况下,每个页面作者都有不同的个人信息,所以你无法事先知道应该用什么作为缺省值,但你又的确需要提供每个人的信息。这时候,你就可以把与联系信息相关的属性定义为必须的(REQUIRED),而且不用提供缺省值。
-
属性值可有可无的属性
当使用IMPLIED关键字时,文法解释器不再强行要求你在XML文件中给该属性赋值,而且也无须在DTD中为该属性提供缺省值。可以说,这是对属性值有无的最低要求,现实中经常用到。
-
固定取值的属性
还有一种特殊情况,你需要为一个特定的属性提供一个缺省值,并且不希望XML文件的编写者把你的缺省值替代掉。这时候,就应该使用FIXED关键字,同时为该属性提供一个缺省值。
-
定义缺省值的属性
如果不使用上面任何一种关键字的话,该种属性就是属于这种类型。对于这种属性,你需要在DTD中为它提供一个缺省值。而在XML文件中可以为该属性给出新的属性值来覆盖事先定义的缺省值,也可以不另外给出属性值,后一种情况下它就默认为采用DTD中给出的缺省值。
视实际情况而选择,给出一个实际的例子:
<!ATTLIST 页面作者
姓名 #CDATA #IMPLIED
年龄 #CDATA #IMPLIED
联系信息 #CDATA #REQUIRED
网站职务 #CDATA #FIXED "页面作者"
个人爱好 #CDATA "上网">
另外还有属性的类型:
CDATA
Enumerated
ID
IDREF
IDREFS
ENTITY
ENTITIES
NMTOKEN
NMTOKENS
NOTATION
参数实体专门用在DTD中。定义方式是:
<!ENTITY % 实体名 "实体内容">
或
<!ENTITY % 实体名 SYSTEM "外部文件名">
引用方式为: %实体名;
使用参数实体,可以方便元素和属性的声明。例如:
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>
分享到:
相关推荐
使用DTD验证XML文档 一、 DTD的定义: a) DTD是Document Type Defintion的缩写,即文档类型定义。DTD用来描述XML文档的结构。 二、 DTD可能包含的内容: a) 元素的定义规则。 b) 元素之间的关系规则。 c) 属性的定义...
4. 使用DTD验证XML文档的有效性:DTD可以用于验证XML文档的有效性,以确保XML文档符合预定义的结构和约束。 5. XML文档与DTD文档的互相转换:可以使用工具将XML文档转换为DTD文档,也可以将DTD文档转换为XML文档。 ...
本文将深入探讨DTD验证XML的概念、原理以及如何进行实践操作。 XML文档通过DTD来规定其元素、属性、元素间的关系,以及它们可能出现的顺序。DTD定义了一个模式,使开发者可以限制XML文档的数据类型和结构,从而避免...
验证XML文档时,我们需要创建一个SAX解析器并配置它使用指定的DTD。在Java中,我们可以使用`javax.xml.parsers.SAXParserFactory`类来创建解析器工厂,然后调用`newSAXParser()`方法生成解析器。接下来,我们需要...
关联外部DTD后,解析器会根据DTD验证XML文档,确保文档遵循预定义的规则。如果XML文档中的元素或属性不符合DTD的定义,解析器将报告错误。 外部DTD的好处包括: 1. **模块化**:由于DTD与XML文档分离,我们可以...
5. **Java中的DTD验证**:在Java中,可以使用`javax.xml.parsers.DocumentBuilderFactory`和`DocumentBuilder`类来验证XML文档。首先,创建一个`DocumentBuilderFactory`实例,然后设置其验证属性为true,并指定DTD...
在这种情况下,我们可以采取一些策略来忽略DTD验证,从而避免`System.Xml.XmlException`的抛出。 首先,我们可以使用`XmlDocument`类加载XML文件时设置`XmlResolver`属性为`null`。这将阻止XML解析器尝试解析任何...
(1)通过实验,进一步理解掌握DTD的语法规则,能够编写...(3)通过实验,进一步掌握在XML SPY中应用DTD验证XML文档有效性的方法。 (4)通过实验,学会利用标准DOM接口,编写Java程序实现基于DTD对XML文档的有效性验证。
而"设计一种表示图书信息的XML文档"可能是提供了一个具体的示例,展示如何用XML表示图书信息,可能包括书名、作者、出版社和出版年份等字段,并用DTD或XML Schema进行验证。 总之,XML文档的设计和验证是XML技术中...
这样,XML解析器在解析文档时会根据DTD验证文档的结构是否合法,如果不符,则文档会被认为是无效的。 随着技术的发展,XML Schema逐渐取代了DTD,因为它提供了更强大、更灵活的数据类型定义,支持命名空间,并且...
XML Schema是W3C推荐的更现代的XML验证工具,相比DTD,它提供了更丰富的数据类型和更强的结构约束。XML Schema允许定义复杂数据类型,如日期、时间、浮点数等,并且支持命名空间,使得在大型项目中管理不同的XML元素...
如果 DTD 是在 XML 源文件的外部,就需要在 XML 文件内用以下的语法声明 DOCTYPE:`<!DOCTYPE 根元素 SYSTEM "文件名">`。下面是一个使用外部 DOCTYPE 声明的 XML 例子: ```xml <?xml version="1.0"?> <!DOCTYPE ...
`Main.xml`、`book2.xml`、`book3.xml`这三个文件可能是使用了上述DTD定义的XML文档实例。`Main.xml`可能是一个主文档,包含了对其他XML文档的引用或集合;`book2.xml`和`book3.xml`则可能是分别描述两本书的信息,...
文档类型定义(DTD,Document Type Definition)是XML文档的一个重要组成部分,它定义了XML文档的...在实际的开发工作中,尤其是在需要跨系统、跨平台传输和处理数据时,使用DTD来定义和验证XML文档结构显得尤为重要。
"DTD练习.rar"和"SCHEMA练习.rar"可能包含了一些实践性的练习题,帮助你深入理解如何使用DTD和XML Schema来定义和验证XML文档。 总的来说,这些文件涵盖了XML的基础知识,如XML结构、DTD的使用、XSLT转换以及DOM...
学习这部分内容,你将能掌握如何使用Java进行XML文件的读写,如何定义和验证XML文档结构,以及如何在实际项目中利用XML进行数据交换和存储。这不仅对理解XML的基本概念至关重要,也有助于提升你的Java开发能力,特别...
通过深入学习这个源程序,开发者可以掌握如何有效地使用XML存储和传输数据,使用DTD来验证XML文档的结构,以及如何利用HTML和XSLT将数据转化为用户友好的网页。这对于Web开发、数据交换、以及构建可扩展的应用程序都...