使用 DTDHandler 和 EntityResolver

本节介绍了剩余的两个 SAX 事件处理程序:DTDHandlerEntityResolver。当 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..">

当解析器看到未解析的实体或符号声明时,它将不使用任何信息,只能使用DTDHandlerinterface将其传递给应用程序。该interface定义了两种方法。

  • notationDecl\(String name, String publicId, String systemId\)

  • unparsedEntityDecl\(String name, String publicId, String systemId, String notationName

传递notationDecl方法的符号名称和公共标识符或系统标识符,或两者,这取决于在 DTD 中声明的名称。 unparsedEntityDecl方法被传递给实体名称,适当的标识符以及它使用的符号名称。


注意- DTDHandlerinterface由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"

EntityResolverinterface定义了一个方法:

resolveEntity(String publicId, String systemId)

此方法返回一个InputSource对象,该对象可用于访问实体的内容。将 URL 转换为InputSource很容易。但是,作为系统 ID 传递的 URL 将是原始文档的位置,该位置很可能不在网络上。要访问本地副本,如果有,则必须在系统上的某个位置维护一个目录,该目录将名称(公共 ID)Map 到本地 URL。