使用 DTDHandler 和 EntityResolver
本节介绍了剩余的两个 SAX 事件处理程序:DTDHandler
和EntityResolver
。当 DTD 遇到未解析的实体或符号声明时,将调用DTDHandler
。当必须将 URN(公共 ID)解析为 URL(系统 ID)时,EntityResolver
起作用。
DTDHandler API
选择解析器实现显示了一种使用 MIME 数据类型引用包含二进制数据的文件(例如图像文件)的方法。这是最简单,最可扩展的机制。但是,为了与较旧的 SGML 样式的数据兼容,也可以定义未解析的实体。
NDATA
关键字定义了一个未解析的实体:
<!ENTITY myEntity SYSTEM "..URL.." NDATA gif>
关键字NDATA
表示此实体中的数据不是可解析的 XML 数据,而是使用其他某种表示法的数据。在这种情况下,标记名为gif
。然后,DTD 必须包含该表示法的声明,该声明应类似于以下内容。
<!NOTATION gif SYSTEM "..URL..">
当解析器看到未解析的实体或符号声明时,它将不使用任何信息,只能使用DTDHandler
interface将其传递给应用程序。该interface定义了两种方法。
-
notationDecl\(String name, String publicId, String systemId\)
-
unparsedEntityDecl\(String name, String publicId, String systemId, String notationName
传递notationDecl
方法的符号名称和公共标识符或系统标识符,或两者,这取决于在 DTD 中声明的名称。 unparsedEntityDecl
方法被传递给实体名称,适当的标识符以及它使用的符号名称。
注意- DTDHandler
interface由DefaultHandler
类实现。
标记也可以在属性声明中使用。例如,以下声明要求 GIF 和 PNG 图像文件格式使用符号。
<!ENTITY image EMPTY>
<!ATTLIST image ... type NOTATION (gif | png) "gif">
在这里,类型被声明为 gif 或 png。如果未指定,则默认值为 gif。
无论是使用符号引用来描述未解析的实体还是属性,都取决于应用程序进行适当的处理。解析器完全不了解这些符号的语义。它仅传递声明。
EntityResolver API
EntityResolver
API 可让您将公共 ID(URN)转换为系统 ID(URL)。您的应用程序可能需要这样做,例如,将href="urn:/someName"
转换为"http://someURL"
。
EntityResolver
interface定义了一个方法:
resolveEntity(String publicId, String systemId)
此方法返回一个InputSource
对象,该对象可用于访问实体的内容。将 URL 转换为InputSource
很容易。但是,作为系统 ID 传递的 URL 将是原始文档的位置,该位置很可能不在网络上。要访问本地副本,如果有,则必须在系统上的某个位置维护一个目录,该目录将名称(公共 ID)Map 到本地 URL。