为XML添彩:用DTDs提供文档格式化程度

ZDNet软件频道 时间:2002-04-26 作者:BUILDER.COM |  我要评论()
本文关键词:DTD XML
为了增强XML文档结构化要求,必须利用XML的辅助技术——数据类型定义(DTD),这也是本文的重点。
欢迎再次来到程序员XML基础知识单元系列,本系列的第一部分文章介绍了XML文档的基本结构及其语法。简单回忆一下,XML文档自身定义了其数据结构。无须事先假定元素的数据类型及其包含的数据结构,意思就是说,只要满足XML语法规则,就会按照事先假定的格式完成,当然这些也要靠程序员本身来确定它们之间的相互关系。对于分布数据而言在系统上按这种方式操作可能是一种好办法,但是,保持数据的连贯性未必是最好的方式。

为了增强XML文档结构化要求,必须利用XML的辅助技术——数据类型定义(DTD),这也是本文的重点,同是还要举Listing AXML文档的那个例子。

DTDs定义

DTDs是定义XML文档格式最古老也是最简单的方法。象大多数XML一样,DTDs是由World Wide Web机构(W3C)定义的,关于这点可以参考W3C's current XML specification。

DTDs能实现指定可行标签、元素、属性、每一元素的应用次数以及元素在指定XML文件中的排序等功能。DTDs可以提供数据类型强化的限定类型,从另一种意义上来说,也就是你可以自行确定一个元素是否含有其他元素、其它数据或者为空。

XML文件的头部含有!DOCTYPE标签来与DTDs相关联,这个标签中含有DTDs的文件名(如果有SYSTEM这个词的话,见表A)或者URL或者DTDs文件(如果有PUBLIC这个词的话)。XML文件也可以声明为独立的,简单来讲就是DTDs包含在文件中作为!DOCTYPE头标签。

当打开DTD关联XML文件时,就是要使DTD在文件中生效,如果违反了DTD规则,那么就会出错。

两种正确的方式:格式正确与生效

XML文件必须满足两个正确的标准,第一个就是格式要正确,也就是说要满足基本XML语法规则,文档必须能够被读取才说明格式是正确的,否则就存在格式错误问题,也就不能被读取。

另一个标准称为“生效”,它是可选的,意思就是说文件应该使DTDXML生效,XML解析器不能读取XML文件或者不能纠正XML文件的话,也就不能继续下去。

有很多行业标准DTDs,它们是专为不同信息设计的。由于这些DTDs被预先确定,而且XML解析器会使所有过程生效,因此运行XML应用程序就会很简单。如果想要与其它应用程序或其他企业交换信息的话,采用标准DTD是非常值得的,而且采用标准数据格式也会使应用程序集成起来更容易。XML.org是由企业搜集的可供查询的DTDs目录,而且我相信从那里会找到很多有用的信息。

定义数据结构

XML的数据类型定义包括DTD声明、参照数据类型、定义可用元素及其在文件中的顺序。DTD声明的一般过程是:

<!ELEMENT elementname (elementtype modifiers)>

DTD元素修改器定义了可用内容及元素的应用次数,见表A。

表A

Modifier Example Meaning
None SomeElement (A) May contain one and only one occurrence of A
? SomeElement (B?) May contain zero or one occurrence of B
* SomeElement (C*) May contain zero, one, or more occurrences of C
+ SomeElement (D+) May contain one or more occurrences of D, always at least one occurrence is required
| SomeElement (E|F) May contain either one occurrence of E or one occurrence of F
EMPTY SomeElement(EMPTY) Element is always empty and may not contain anything
#PCDATA SomeElement(#PCDATA) May contain any form of non-element data

一些常用的DTD元素修改器

看一看Listing B,这是一个数据类型定义,它描述了Listing A中书目录的结构,来看看这一数据类型定义并逐项检查一下。

首先看看根目录的元素定义,它必须包含一个或更多的书元素,(在书元素名的后面用+标注):

<!ELEMENT catalog (book+)>

在后见的几行可以看见书元素本身的定义,它必须要含有下面的一些内容:

  • 一个或多个作者元素,因为一本书可能有多个合著者
  • 一个标题元素
  • 一个或多个类型元素,因为一本书可能属于多种类型
  • 一个价格元素
  • 一个出版日期元素
  • 没有或有一个表述元素,因为表述是可选项

接着,DTD定义了这些书元素:作者、标题、类型、价格、出版日期以及表述。所有这些元素都被定义为可解析的字符数据(PCDATA),基本意思就是这些元素都带数据,但却不含其它元素。

接下来的工作是什么?

尽管Listing B中的DTD都生效了,但是,在这里我还是要多说一句,我们并没有定义这些元素在文件中的顺序,我到最后才提这个问题是为了把它单独讨论。实际上,我要定义这些元素在XML文件中的顺序并在元素应用后立即为其赋值。

<!ATTLIST associatedelement
   attributename1 attributetype1 modifiers
   attributename2 attributetype2 modifiers
>

Associatedelement是要赋值或已赋值的元素,它排在所有其它已赋值的元素之后,AttributenameAttributetype的值,Attributetype是值的类型,所有类型包括:

  • CDATA—是一列值,当一个值含有确切数据而与其他元素无关时使用
  • ID—独一无二的定义,一个元素只能定一个id值,而且要么是确定的要么是关联的。
  • IDREF—id值要参照其它元素
  • NMTOKEN—表示单个元素或者一类无界元素
  • Enumeration—可能有很多在CDATA中已定义的值

这些类型的用处只有当对文件进行查询或转换时才会突出出来,不要担心,在后面的网站开发问题上我问将对此进行讨论。

这些值也可以做下面的变化,给解析器提供更多信息,通常是缺省值,可以有:

  • #REQUIRED—这一值是必须的,而且必须已定义且有值
  • #IMPLIED—这一值没有缺省值,可自行选择
  • #FIXED—这一值通常有一个特殊值,它可以做下面的改变,比如:<!ATTLIST State SalesTax #FIXED "0.06">.
  • 定义缺省值的文字列,如果元素没有详细包含解析文档的值,那么这行文字就是缺省值
坏消息

DTDs有一个缺点:对于一个特定元素(不管这个元素是否包含其它元素或者为空,或者包含数据)不能满足类型规则,因此,如果想要多次检查文件的结构,那么这一应用就要受到限制,在类似这样的情况下,就需要重新回到XML,可以看看下一篇文章。

责任编辑:炒饭

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134