JSP  DTD概念
DTD是XML文件的验证机制,属于XML文件组成的部分。DTD在XML文件所扮演得角就是定义XML文件的元素结构、元素标记和属性。一旦定义好DTD,就可以使用XML解析器对编写好的XML文档进行DTD检查,以判断XML文档内容是否为有效的XML文档内容。XML文档为应用程序之间交换数据交换提供一种标准。DTD的主要目的是让XML文档能够成为数据交换的标准。这是因为不同的公司只需定义好DTD,其他公司就能够依照该DTD建立XML文档。这样公司之间就很方便地使用XML文档进行数据交换。
DTD可以在XML文档中直接写入,也可以单独形成文件。因此,DTD分为外部DTD和内部DTD两种。外部DTD就是后缀为.dtd的文件。该文件可以被多个XML文档共享和DTD调用。内部DTD是在XML文档中直接定义DTD,该DTD只能够被当前XML文档使用。
文档类型声明以“<!DOCTYPE”为开始,以“]>”结束。通常将开始和结束放在不同的行上。内部文档类型定义(即内部DTD)是包含在XML文档内部的DTD,其基本语法格式如下所示:
<!DOCTYPE 根元素名称 [
  <!ELEMENT 子元素名称 (#PCDATA)>
]>
<!DOCTYPE:文档类型声明的起始定界符。
根元素名:一个XML文档只有一个根元素。如果XML文档使用DTD,那么文档中的根元素名就在内部DTD中指定。
<!ELEMENT 子元素名称(#PCDATA)>:用来定义出现在文档中的元素。下一节将介绍如何定义元素。
]>:文档类型声明的结束定界符。
先通过下面实例来简单了解如何在XML文档中使用内部DTD,代码如下所示:
<?xml version ="1.0" encoding="GB2312" standalone="yes" ?>
<!DOCTYPE company [
  <!ELEMENT company (employeer*)>
  <!ELEMENT employeer (name,sex,birthday)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT sex (#PCDATA)>
  <!ELEMENT birthday (#PCDATA)>
]>
<company>
  <employeer>
    <name>王小燕</name>
    <sex>女</sex>
    <birthday>1986.4.23</birthday>
  </employeer>
</company>
上述代码保存为l文档。XML文档声明中standalone="yes"表明该文档不依赖外部DTD文件。“<!DOCTYPE”标记和“]>”标记之间的内容是文档类型声明,<!ELEMENT >标记定义在文档根元素company下可以出现的子元素。在浏览器中打开该文档,效果如图7-6所示。
图7-6  内部DTD
在上图中出现<!DOCTYPE company (View Source for )>,该字符串的出现表明XML文档使用文档类型定义DTD
DTD约定中还可以使用中文,其代码如下所示:
<?xml version ="1.0" encoding="GB2312" standalone="yes"  ?>
<!DOCTYPE company [
  <!ELEMENT 公司 (员工*)>
  <!ELEMENT 员工 (名称,性别,生日)>
  <!ELEMENT 名称 (#PCDATA)>
  <!ELEMENT 性别 (#PCDATA)>
  <!ELEMENT 生日 (#PCDATA)>
]>
<公司>
  <员工>
    <姓名>赵章帅</姓名>
    <性别></性别>
    <生日>1986.5.1</生日>
  </员工>
</公司>
XML文档通过URL所引用的独立DTD被称为外部子集(即外部DTD)。外部子集在物理上位于一个独立文件中,该文件的扩展名为.dtd。外部子集可以供多个XML文档使用。如果需要在XML文件中使用外部DTD,那么必须在XML文档的文档类型定义部分通过URL引用外部DTD,语法格式声明如下:
<!DOCTYPE 根元素名称 SYSTEM "DTD-URL">
<!DOCTYPE根元素名称 PUBLIC "DTD-name" "DTD-URL">
<!DOCTYPE:关键字,表示引用外部DTD。
根元素名称:在外部DTD定义的根元素。
SYSTEM:关键字,指该外部DTD文件是私有的,即由用户创建但没有公开发行,只是个人或几个合作者之间使用。
PUBLIC:关键字,指该外部DTD文件是公有的,用PUBLIC的DTD都有一个逻辑名称DTD-name,必须在调用时指明这个逻辑名称。使用PUBLIC关键字通常表示DTD的使用范围相对广一些(例如HTML文档中也可以使用DTD)。
DTD-URL:通过URL将外部DTD引用到XML文档中。例如有一个名为“bookrule.dtd”的
外部DTD文件放在某出版社的URLwww.bookpublish的地方,那么在XML文档中的引用如下所示:
<!DOCTYPE Book SYSTEM  "www.bookpublishout/bookrule.dtd">
通过把l文档中内部DTD转换成外部DTD,目的是说明如何使用外部DTD文档。转换后的外部DTD文件内容如下所示:
<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT company (employeer*)>
<!ELEMENT employeer (name,sex,birthday)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
对于外部DTD文件的编写,推荐使用Windows自带的记事本编写,然后把文件另存为为“filename.dtd”,同时设置DTD文件的encoding编码方式。把上述代码另存为company.dtd,文件编码选择UTF-8。在此DTD文件中使用元素类型来声明XML文档中所包含的元素以及文档结构。关于元素类型声明将在下一节讲解。在XML文档中使用外部DTD文件如下所示:
<?xml version ="1.0"  encoding="utf-8" standalone="no" ?>
<!DOCTYPE company SYSTEM "company.dtd">
<company>
  <employeer>
    <name>王小燕</name>
    <sex>女</sex>
    <birthday>1986.4.23</birthday>
  </employeer>
</company>
上述代码另存为l文件。XML文档的XML声明使用standalone="no",则表明该文档使用外部DTD文件。由于XML文档与所引用的DTD文件都在同一目录下,所以使用相对路径就可以引用company.dtd文档。运行效果如图7-7所示。
jsp帮助文档图7-7 外部DTD的运行结果
由图7-7中可以看出,外部DTD的运行结果和内部DTD的运行结果完全一样,只是使用的方式不同。外部DTD文档可以被多个XML文档共享,而内部DTD文档只能被它所在的XML文档使用。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。