2007-2-25 17:31
hinet
3.1.1.3 外部DTD
3.1.1.3 外部DTD
一个DTD既可以是内部的,包含在一个“形式良好的”XML文件中(standalone=“yes”),采用前面一节中的形式;也可以是外部的,作为一个外部文件被引用(standalone=“no”)。
外部DTD的好处是:它可以方便高效地被多个XML文件所共享。你只要写一个DTD文件,就可以被多个XML文件所引用。事实上,当许多组织需要统一它们的数据交换格式时,它们就是通过外部DTD来完成的。这样做不仅简化了输入工作,还保证当你需要对DTD做出改动时,不用一一去改每个引用了它的XML文件,只要改一个公用的DTD文件就足够了。不过需要注意,如果DTD的改动不是“向后兼容”的,这时原先写的那些XML文件可能就会出问题了!
为了引用一个外部DTD,必须修改XML声明和DOCTYPE声明。
XML声明中必须说明这个文件不是自成一体的,即standalone属性的属性值不再是yes了。
encoding="GB2312"
standalone = "no"?>
在DOCTYPE声明中,应该加入SYSTEM属性:
<DOCTYPE 根元素名
例如:
<DOCTYPE 联系人列表
上面的URL是一个绝对路径,除此以外,它还可以是一个相对路径,如:
<DOCTYPE 联系人列表
它说明这个DTD文件和引用它的XML文件在同一个目录下。或者,这个DTD文件还可能在XML文件的父目录的子目录DTD下,表示为:
<DOCTYPE 联系人列表
使用这种方法,你可以方便地把DTD文件从你的XML文件中分离出来,粘贴到另一个文件fclml.dtd中。这样,你就得到一个DTD文件和一个有效的XML文件。
仍然回到前面那个包含客户联系方式信息的XML文件,如果使用外部DTD,其形式应该变为下面这个样子。
DTD文件fclml.dtd:
<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:
<DOCTYPE 联系人列表
<联系人列表>
<联系人>
<姓名>张三
001
<公司>A公司
[email]zhang@aaa.com[/email]
<电话>(010)62345678
<地址>
<街道>五街1234号
<城市>北京市
<省份>北京
100001
<联系人>
<姓名>李四
002
<公司>B公司
[email]li@bbb.org[/email]
<电话>(021)87654321
<地址>
<街道>南京路9876号
<城市>上海
<省份>上海
200002
在这一节里,我们将为每个XML文件定义的DTD推广到一个系统内可共享的DTD。在下一节里,我们还可以将这个推广进一步推而广之,扩大到行业内甚至公众使用的公用DTD。