以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  简单的DTD例子描述和分析  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=8380)


--  作者:hsower
--  发布时间:6/19/2004 2:16:00 PM

--  简单的DTD例子描述和分析
简单的DTD例子描述和分析

  下面举一个带有内部DTD的XML文档的例子:

  <?xml version="1.0" encoding="GB2312" ?>
  <!DOCTYPE 家庭 [
   <!ELEMENT 家庭 (人+,家电*)>
   <!ELEMENT人 EMPTY>
   <!ELEMENT 家电 EMPTY>
   <!ATTLIST 人
    名字 CDATA #REQUIRED
    性别 (男|女) #REQUIRED
    年龄 CDATA #REQUIRED
    爱好 CDATA #IMPLIED
   >
   <!ATTLIST 家电
     名称 CDATA #REQUIRED
     数量 CDATA #REQUIRED
     说明 CDATA #IMPLIED
    >
  ]>  
  <家庭>
  <人>
  <名字>郭大路
  <性别>男
  <年龄>25
  
  <人>
  <名字>李寻欢
  <性别>男
  <年龄>38
  <爱好>作个教育家和伟人
  
  <家电>
  <名称>彩电
  <数量>3
  
  

  这个文档从第二行开始进行文档类型声明,包含了文档元素(家庭)的名称。根据定义,我们发现该元素可以包含一个或者多个人(由这个+号决定的),可以包含零个或多个家电(由这个*符号决定),然后定义了人这个元素的需要的属性,其中名字、性别和年龄是必须的,而爱好可以填有也可以不填。家电的名字和数量属性必须有,但说明可以写也可以不写。

  如果采用外部DTD的话,就需要有两个文档,第一个文档就是关于DTD的文档,第二个文档就是遵守DTD格式的内容文档。实际上我们可以建立无穷多个遵守该DTD格式的文档。举一个例子来说,我们在构造关系数据库中的表的时候,我们需要定义好表的结构(也就是表包含的字段集合),然后我们就可以往这个表中放入记录,记录的个数从理论上讲可以是无穷多个的。这里关于表的结构就类似于DTD文档。记录类似于遵守DTD格式的内容文档。外部DTD的好处是:它可以方便高效地被多个XML文件所共享。你只要写一个DTD文件,就可以被多个XML文件所引用。事实上,当许多组织需要统一它们的数据交换格式时,它们就是通过外部DTD来完成的。这样做不仅简化了输入工作,还保证当你需要对DTD做出改动时,不用一一去改每个引用了它的XML文件,只要改一个公用的DTD文件就足够了。不过需要注意,如果DTD的改动不是"向后兼容"的,这时原先根据该DTD编写的那些XML文件可能就会出问题了。

  现在我们就尝试建立一个DTD文档,不妨命名为Home.dtd。其代码如下:

  <?xml version="1.0" encoding="GB2312" ?>
  <!ELEMENT 家庭 (人+,家电*)>
  <!ELEMENT人 EMPTY>
  <!ELEMENT 家电 EMPTY>
  <!ATTLIST 人
    名字 CDATA #REQUIRED
    性别 (男|女) #REQUIRED
    年龄 CDATA #REQUIRED
    爱好 CDATA #IMPLIED
   >
  <!ATTLIST 家电
   名称 CDATA #REQUIRED
   数量 CDATA #REQUIRED
   说明 CDATA #IMPLIED
  >

  然后,我们可以建立一个遵守该DTD格式的内容文档,不妨设为HomeInstance.xml。其代码如下:

  <?xml version="1.0" encoding="GB2312" ?>
  <!DOCTYPE 家庭 SYSTEM "Home.dtd">
  <家庭>
  <人>
  <名字>郭大路
  <性别>男
  <年龄>25
  
  <人>
  <名字>李寻欢
  <性别>男
  <年龄>38
  <爱好>作个教育家和伟人
  
  <家电>
  <名称>彩电
  <数量>3
  
  

  把这两个文档放到同一个目录下,然后可以用XML浏览器对HomeInstance.xml进行浏览,结果应该和使用内部DTD的结果一样。

  众所周知,在设计MIS应用程序的时候,重要的是要进行E-R图设计,然后建立关系数据库,建立数据库的关键就是要定义好表的格式,并使它的范式尽可能的高。对应的,建立基于XML应用的关键就是要定义好DTD,然后所有的内容就按照DTD格式进行编写。DTD实际上表现了一个层次的关系,你也可以把它理解成一棵树的结构。树中的节点实际上就是一个个元素(ELEMENT),一个元素可以包含其他的元素。比如上面的例子中家庭这个元素包含了人和家电这两个元素。一个元素可以包含属性(ATTLIST)也可以没有任何属性。比如上面的例子中,家庭这个元素就没有任何属性,而人和家电都有自己的属性。

  际上如果大家学过编译系统的话,都知道对编程语言进行语法定义的工具:巴科斯-诺尔范式。它是用来对语言的语法进行定义的工具。实际上DTD就是起到了类似的作用。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms