文档

Java™教程
隐藏目录
使用DTDHandlerEntityResolver
路径: Java XML处理API (JAXP)
课程: 简单XML API

使用 DTDHandlerEntityResolver

本节介绍了另外两个 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..">

当解析器遇到未解析的实体或符号声明时,会将这些信息传递给使用 DTDHandler 接口的应用程序,但不会对其进行任何处理。该接口定义了两个方法。

notationDecl 方法传递了符号的名称和公共或系统标识符(取决于 DTD 中的声明方式)。unparsedEntityDecl 方法传递了实体的名称、相应的标识符和使用的符号名称。


注意: DTDHandler 接口由 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 接口定义了一个方法:

resolveEntity(String publicId, String systemId)

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


上一页: 处理词法事件
下一页: 更多信息