通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>XML专区>>正文 新版上线![旧版]
注:打开慢时请稍等

给XML文件定义DTD

http://www.iyit.net  日期:2006-5-24 12:05:23  来源:整理转载   点击:
参加讨论】    DTD实际上可以看作一个或多个XML文件的模板,这些XML文件中的元素、元素的属性、元素的排列方式/顺序、元素能够包含的内容等,都必须符合DTD中的定义。XML文件中的元素,即我们所创建的标记,是根据我们应用的实际情况来创建的。想要创建一份完整性高、适应性广的DTD是非常困难的,因为各行各业都有他们自己的行业特点,所以DTD通常是以某种应用领域为定义的范围,如:医学、建筑、工商、行政。DTD定义的元素含盖范围越广泛,那么就越复杂。

    DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。比如,有几十家相互联系的、合作伙伴关系的公司、厂商,他们相互之间的交换电子文档都是用XML文档。那么我们可以将这些XML文档的DTD放在某个地方,让所有交换的XML文档都使用此DTD,这是最方便的做法,同时也适用于公司内部的XML文件使用。

内部DTD

内部DTD是在XML文件的文件序言区域中定义的。语法:

〈!DOCTYPE element-name[........

]〉


〈!DOCTYPE :表示开始设定DTD,注意DOCUTYPE是大写。

Element-name :指定此DTD的根元素的名称,一个XML文件只能有一个根元素。注意,如果 XML文件使用了DTD,那么文件中的根元素就在这里指定。

[.........]〉 :在[ ]标记里面定义XML文件使用元素,然后用〉结束DTD的定义。

下面,我们来看一下怎样给XML文件定义DTD,请见例1。

例1中的DTD定义区可以看作是一个DTD定义的大概框架,为其他XML文件定义DTD,结构和例1的DTD差不多,只是可能需要添加、删除或者更改一些东西而已。在DTD定义的中间是元素设定,这是一个DTD的最主要部分,其主要语法如下:

〈!ELEMENT element-name element-definition〉


〈!ELEMENT:表示开始元素设置,注意此处ELEMENT关键字是大写。

element-name:表示要设置的元素的名称。

element-definition:指明要对此元素进行怎样的定义,就是说〈元素〉...〈/元素〉之间能够包含什么内容,是其他元素还是一般性的文字。

在例1中,大家可以看到,〈!ELEMENT 参考资料 (书籍)〉这个元素设定是声明了“参考资料”这个元素,并且它是作为“书籍”这个元素的父元素。〈!ELEMENT 书籍 (名称,作者,价格)〉这个元素设定声明了“书籍”这个元素,并且它是作为“名称”、“作者”、“价格”这三个元素的父元素。而〈!ELEMENT 名称 (#PCDATA)〉这个元素设定声明了“名称”这个元素,但是此元素仅仅包含一般文字,是基本元素,这是由#PCDATA关键字定义的。

在元素设置中,如果元素包含多个子元素,如:〈!ELEMENT 书籍 (名称,作者,价格)〉这种含多个子元素的声明,那么“名称”、“作者”、“价格”这些标记在XML文件中必须以上面排列的顺序出现,每个标记必须而且只能够出现一次。如果在设定元素时,按照〈!ELEMENT 书籍ANY〉,这样在元素下就可以包含任意被设定过的元素,出现的次数和顺序也不受限制,并且在该元素下,除了可以包含子元素以外,还能够包含一般的文字。有时候,在XML文件中,一个标记可能多次出现(或者不出现),那么我们除了在它们的父元素中用ANY关键字之外,还可以在元素的旁边加上特定的符号来控制标记出现的次数。这些符号见表1。

表1

符号

代表标记出现的次数

不出现或只出现一次

*

不出现或可出现多次

+

必须出现一次以上

无符号

只能出现一次


例如:〈!ELEMENT 参考资料(书籍,报纸+,杂志?,网站)〉这个元素设定,“书籍”标记在XML文件中可以不出现或者出现多次;“报纸”标记必须出现一次以上;“杂志”标记可以不出现或只出现一次;而“网站”标记必须出现而且只能出现一次。

在一些父元素的声明中,有可能它包含的子元素是在多个子元素中选择一个来使用,那么我们声明此父元素时,就可以把它声明成选择性元素,例如:〈!ELEMENT 配偶 (妻子|丈夫)〉。可供选择的子元素用“|”分隔,这样,我们在XML文件中可以这样写:

〈配偶〉

〈丈夫〉张三〈/丈夫〉

〈/配偶〉


只从中选择一个子元素。

在我们的XML文件中,还可能包括很多“空元素”,即:元素是单独存在的,没有〈/元素〉这样的结束标记。那么在DTD中是用EMPTY关键字来声明的。如:〈!ELEMENT 元素名 EMPTY〉。在XML文件中,空元素不需要结束标记,但必须以〈/空元素名〉这样的写法。

在DTD中,还可以声明一些称为Entity的东西,让DTD和XML文件使用。我们可以把Entity看作是一个常量,它有一定的值。在DTD中,Entity的声明语法为:〈!ENTITY entity-name entity-definition〉。例如:我们在DTD中声明〈!ENTITY PC "(#PCDATA)"〉 ,那么在后面的元素设定中,就可以使用这个Entity来代替“(#PCDATA)”这个字符串,如:〈!ELEMENT 作者 (#PCDATA)〉可以写成〈!ELEMENT 作者 &&PC;〉。引用Entity的时候,必须要在Entity名称前面加上“&&”符号,后面加上“;”符号。

在例1中,〈!ATTLIST 价格 货币单位 CDATA #REQUIRED〉这一句是设定元素的属性,关于元素属性设置的语法为:〈!ATTLIST element-name attribute-name Type Default-value〉 。其中,〈!ATTLIST是开始属性的设定(注意大小写)。element-name是指明此属性设定是针对什么元素的;attribute-name是设定的属性的名称;Type是该属性的属性值的类别,属性值有多种,可以是一般的文字,或从几种属性值中取一种等,属性值的种类见表2。Default-value是指该属性的内定值种类,有四种不同的属性内定值(见表3)。

下面我们举几个例子来看一下几个常用的元素属性的设定。例:

〈!ATTLIST 姓名 性别 (男|女) "男"〉

此元素属性设定是为“姓名”这个元素设定一个名为“性别”的属性,此属性的属性值类别是Enumerated,取值范围为“男”或者“女”(用“|”分隔)。如果在XML文件中没有为此属性赋值,那么就取值为“男”,因为属性内定值是一个字符串“男”。

〈!ATTLIST 姓名 号码 ID #REQUIRED〉

该属性设定是为“姓名”元素设定一个名为“号码”的属性,属性值类别是ID,意味着在XML文件中为此属性赋值的时候,值在此XML文件中是唯一的,如在同一份XML文件中出现下面的XML语句:

〈姓名 号码="1234567"〉张三〈/姓名〉

〈姓名 号码="1234567"〉李四〈/姓名〉

注意:“号码”属性的值重复了,这样,在解析过程中将会出现错误信息。此属性设定中的属性内定值为#REQUIRED,表示这个属性在XML文件的〈姓名〉标记中必须出现,否则解析会发生错误。

〈!ATTLIST 电话号码 国家代码 CDATA #FIX "86"〉

该属性设定是为“电话号码”这个元素设定一个名为“国家代码”的属性,该属性的值是一般的文字。在〈电话号码〉标记中不能够设定该属性,因为这个属性被设为具有固定值的属性(#FIX关键字),解析器会自动地将该属性以及值“86”加到〈电话号码〉标记中。

表2

属性值类别

描述

cdata

属性值仅仅是一般的文字。

enumerated

列出该属性的取值范围,一次只能有一个属性值能够赋予属性。

nmtoken

表示属性值只能由字母、数字、下划线、. 、:、-这些符号组成。

nmtokens

表示属性值能够由多个nmtoken组成,每个nmtoken之间用空格隔开。

id

该属性在xml文件中是唯一的,常用来表示人的身份证号码。

idref

表示该属性值是参考了另一个id属性。

idrefs

表示该属性值是参考了多个id属性,这些id属性的值用空格隔开。

entity

表示该属性的设定值是一个外部的entity,如一个图片文件。

entities

该属性值包含了多个外部entity,不同的entity之间用空格隔开。

notation

属性值是在dtd中声明过的notation(声明用什么应用软件解读某些二进制文件,如图片)。


在XML的规范中,还规定了两个内定的属性,即:xml:space和xml:lang ,内定的属性名称以xml:开头,而你自己定义的属性名不能以xml:开头,否则在解析时会发生错误。

我们前面已经讲过,空白格在XML文件是有含义的,xml:space属性就是来设置解析器将XML文件中的空白格传给应用程序后的处理方法。xml:space是一个Enumerated类型的属性,只能够在default和preserver之间取值。xml:space="defaule"表示解析器将空白格传递给应用程序后,由应用程序内定的方法来处理这些空白格。如果没有设定xml:space属性,则解析器会默认用default来设定该属性。xml:space="preserver"是表示解析器将空白格传递给应用程序后,要求应用程序保留这些空白格。

xml:lang属性是用来设置标记中的文字信息是使用哪种语言,ISO-639规定了不同语言的代表缩写,如:xml:lang="en" 表示英文;xml:lang="la"表示拉丁文;xml:lang="zh" 表示中文资料;xml:lang="zh-CN" 表示中文(简体);xml:lang="zh-TW" 表示中文(繁体)。系统内定是xml:lang="en",即标记中间的文字信息都是英文。

外部DTD

外部DTD是一个独立于XML文件的文件,实际上也是一个文本文件,只是使用.dtd为文件扩展名。因为外部DTD独立于XML文件,那么它可以供多个XML文件使用,就像用同一个模板可以写出多个不同内容的文件一样,这多个XML文件因为是引用同一个外部DTD,所以它们的结构大致相同。

外部DTD的创建方式、语法和内部DTD是一样的,把例1的内部DTD的例子用外部DTD来写,文件如下所示。文件存为后缀名为 .dtd的文件。

〈?xml version="1.0" encoding="GB2312" ?〉

〈!ELEMENT 参考资料 (书籍*)〉

〈!ELEMENT 书籍 (名称,作者,价格)〉

〈!ELEMENT 名称 (#PCDATA)〉

〈!ELEMENT 作者 (#PCDATA)〉

〈!ELEMENT 价格 (#PCDATA)〉

〈!ATTLIST 价格 货币单位 CDATA #REQUIRED〉


除了没有内部DTD中的〈!DOCTYPE 参考资料 [.....]〉语句外,其他都一样。而且有关元素数目、排列顺序、空元素设定、选择性元素、Entity声明、属性设定等都和内部DTD是一样的。

XML文件使用〈!DOCTYPE element-name SYSTEM DTD-URL〉或者〈!DOCTYPE element-name PUBLIC DTD-name DTD-URL〉来引用创建好的外部DTD文件。

表3

属性内定值

描述

#required

表示在标记中必须出现此属性。

#implied

标记中可以不出现此属性。

#fix

属性的值是固定的某个值。

字符串

标记中如没有指定属性的值,那么此字符串就是此属性的值。


此语句必须位于XML文件的文件序言区,其中,〈!DOCTYPE表示开始声明应用外部DTD;element-name是指该DTD的根元素的名称;SYSTEM是指该外部DTD文件是私有的,即我们自己创建的,没有公开发行,只是个人或在公司内部或者几个合作单位之间使用;而PUBIC关键字是指该外部DTD是公用的,经过了公开讨论,用PUBLIC的DTD都有一个逻辑名称——DTD-name,我们必须在调用时指明这个逻辑名称。DTD-URL是用URL的方式指明外部DTD文件的位置。例如,我们这份DTD文件存放在URL为:http://www.xml.com/这个地方,文件名为ckzl.dtd。那么在XML文件中的声明如下:

〈?xml version="1.0" encoding="GB2312" ?〉

〈!DOCTYPE 参考资料 SYSTEM "http://www.xml.com/ckzl.dtd"〉

...


Schema简介

DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系。上面的介绍也仅仅是作了一个简介,目的是帮助大家能读懂DTD文件以及在必要时创建简单的DTD文件,因为现在很多的XML应用是建立在DTD之上的。

另外,一个代替DTD的就是W3C定义的Schema,Schema相对于DTD的明显好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用自成一体的语法。这就方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊工具。Schema简单易懂,懂得XML语法、规则的人都可以立刻理解它。Schema的概念提出已久,但W3C的标准最近才出来,相应的应用支持尚未完善,但采用Schema已成为XML发展的一个趋势。



例1

DTD定义区:

〈?xml version="1.0" encoding="GB2312" ?〉

〈!DOCTYPE 参考资料 [

〈!ELEMENT 参考资料 (书籍)〉

〈!ELEMENT 书籍 (名称,作者,价格)〉

〈!ELEMENT 名称 (#PCDATA)〉

〈!ELEMENT 作者 (#PCDATA)〉

〈!ELEMENT 价格 (#PCDATA)〉

〈!ATTLIST 价格 货币单位 CDATA #REQUIRED〉

]〉

〈参考资料〉

〈书籍〉

〈名称〉XML入门精解〈/名称〉

〈作者〉张三〈/作者〉

〈价格 货币单位="人民币"〉20.00〈/价格〉

〈/书籍〉

〈书籍〉

〈名称〉XML语法〈/名称〉

〈!-- 即将出版 --〉

〈作者〉李四〈/作者〉

〈价格 货币单位="人民币"〉18.00〈/价格〉

〈/书籍〉

〈/参考资料〉

编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:动态产生XML文档的几种方式
下一篇:XML文件的显示——CSS和XSL
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
XML和现代CGI应用程序 XML与其相关技术 XML文件的显示——CSS和XSL
动态产生XML文档的几种方式 XML初级应用ABC 编写结构完整的XML文档
XML(可扩展标识语言)的产生 构造未来Web页面的工具语言-- XML XML 入门介绍
XML入门精解之结构与语法 XML基础教程:掌握SAX XML基础入门
建立MSXML 测试环境 XML 论坛 让Asp与XML交互
How to generate XML with SQL 2000 XML的一般信息 存取XML的属性
筛选和排序XML数据 使用XSL样式表来显示XML文件 检查XML文件的有效性
浏览整个XML文件 存取XML实体与卷标 存取与显示XML文件的属性值
最新更新 热点排行 推荐新闻
WML Script标准函数库
WML Script脚本程序设计(二)
WML Script脚本程序设计(一)
WML Script语法基础
WML编程
CGI测试
CGI教程-ErrorDocument 指令
CGI教程-解码数据发送给CGI脚本
跟我学Perl
Perl教学 Perl5的包和模块
Perl教学 Perl的面向对象编程
Perl教学 Perl5中的引用(指针)
Perl教学 格式化输出
Perl教学 关联数组(哈希表)
Perl教学 子程序
WML Script标准函数库
WML Script脚本程序设计(二)
WML Script脚本程序设计(一)
WML Script语法基础
WML编程
优秀公益广告作品欣赏(8)
java数据类型转换
Windows XP专业版IIS连接数的更改
新开放QQ免费挂级网站
优秀公益广告作品欣赏(7)
免费在QQ上看在线电影电视听音乐
QQ珊瑚虫外挂4.0版本发布!
WEB服务器配置全攻略(三)
免费把QQ炫铃设为本机QQ的系统提示音
Office2007简体中文版浮出水面 美图抢
微软将在华推分期付款,充值卡PC 可低价
 AMD处理器AM2测试 风扇竟运行7分钟
exeplorer.exe错误的问题的总结、解决
ASP.NET 2.0 中的异步页功能应用
硬盘坏道修复及数据恢复宝典
免费登录搜索引擎入口大全
搜索引擎注册九大秘法
小心摄像头成为黑客偷窥你的眼睛
内存混插常见问题和解决方法
Office2007简体中文版浮出水面 美图抢
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息