外部通用实体

   包含基本元素/文档实体的主文件以外的数据称为外部文件。通过外部实体引用可在文档中嵌入外部实体和从若干相互独立的文件中获取数据组建为XML文档。
   仅使用内部实体的文档非常类似于HTML模式。文档的完整文本存放于单一文件中,图像、java小程序、声音和非HTML数据也可链接入文件中,但至少在文件中要有所有文本。当然,HTML模式存在一些问题。特别在文档中嵌入动态信息的过程是一件非常困难的事情。可能过使用CGI、JAVA小程序、服务器方面提供的手段和其他各种各样的方法嵌入动态信息,但HTML仅提供静态文档支持。从若干文件中获取数据组建文档的行为必须在HTML外部进行。HTML中解决问题的最简单的方法是使用框架,但这是比较容易令用户迷惑的用户界面。
   部分问题是HTML文档不能自然地插入到另一个HMTL文档中,每个HTML文档有且仅有一个BODY,服务器端嵌入法仅能提供把HTML片段嵌入文档的能力,而不是嵌入有效的文档实体,此外服务器端提供的引用需依赖于服务器的存在,而不是真正的HTML文档部分。
   然而,XML更加灵活。一个文档的基本元素没有必要与另一文档基本元素相同。即使两个文档共享同一基本元素,DTD也可声明元素对自身的包含。在适当的时候,XML标准并不制止结构完整的XML文档嵌入另一结构完整的XML文档的做法。
   要使XML走得更远一些,可定义一个机制,利用这机制可在若干本地或远程系统上的、较小的XML文档的基础上建立新的XML文档。语法分析器的任务就是按固定的序列把所有不同文档组合进来。文档中可含另一文档,或许这个包含其他文档。只要没有递归的文档包含行为,应用程序就仅能看见一个单一、完整的文档。从本质上说,这种机制提供客户端嵌入的功能。
   对XML而言,可使用外部通用实体引用的方法,在文档中嵌入另一文档,在DTD中,可按下列语法结构声明外部引用。
   <! ENTITY name sYSTEM "URL">
   URL就是Uniform Resource Identifier,与URL类似,但允许更加精确的资源链接规范。从理论上说,URL把资源一其储存位置分开,因此WEB浏览器可以选择最近的或最空闲的几个镜像站点,而无须明确指明该链接。URL领域的研究非常活跃,争论激烈,因此在实际应用中,URL就是多用途的URL。
   例如:可能想在站点的每个页面中都放置相同的签字块。为明确起见,假设签字块为如下,而且假定可以从http://eastdajia.com/xml/signature.xml上获得该代码。
   xml签字文件

1<?xml version="1.0">
2<SIGNATURE>
3  <COPYRIGHT>1999Eacely</COPYRIGHT>
4  <EMAIL>Eacely</EMAIL>
5</SIGNATURE>

   在DTD中添加如下声明,可把实体引用&SIG;与这个文件联系在一起:
   <! ENTITY SIGSYSTEM http://eastdajia.com/xml/signature.xml>
   也可以使用相关的URL。例如:
   <! ENTITY SIGSYSTEM "xml/signature.xml">
   如果被引用的文件放置于与引用该文件的文件所处的同一目录中,那么仅需使用一文件名进行引用。如:
   <! ENTITY SIGSYSTEM "signature.xml">
   利用上述任一种声明,仅需使用&SIG;,就可在文档的任意位置引用签字文件的内容:
   SIG外部通用实体引用

 1<?xml version="1.0" standalone="no"?>
 2<! DOCTYPE DOCUMENT [
 3  <!ELEMENT DOCUMENT (TITLE,SIGNATURE)>
 4  <!ELEMENT TITLE (#PCDATA)>
 5  <!ELEMENT COPYRIRHT (#PCDATA)>
 6  <!ELEMENT EMAIL (#PCDATA)>
 7  <!ELEMENT SIGATURE (COPYRIGHY,EMAIL)>
 8  <!ENTITY SIGSYSTEM "http://eastdajia.com/xml/signature.xml">
 9  ]>
10  <DOCUMENT>
11    <TITLE>Entityreferences</TITLE>
12  &SIG;
13  </DOCUMENT>

   注意,外部实体引用的附加作用,因为文件不再完整,所以XML声明中的standalone属性值为no,解析文件表明该文件需要外部文件signature.xml中的数据。
  

posted on 2007-12-24 20:58  C#家园  阅读(395)  评论(0编辑  收藏  举报