public interface EntityResolver
用于解析实体的基本接口。
此模块(包括源代码和文档)在公共域中,同时 没有担保。有关更多信息,请参阅 http://www.saxproject.org。
如果 SAX 应用程序需要实现自定义处理外部实体,则必须实现此接口并使用 setEntityResolver
方法向 SAX 驱动器注册一个实例。
然后 XML 阅读器将允许应用程序在包含外部实体之前截取任何外部实体(包括外部 DTD 子集和外部参数实体,如果有)。
许多 SAX 应用程序不需要实现此接口,但对于从数据库或其他特定的输入源中构建 XML 文档的应用程序,或者对于使用 URI 类型(而不是 URL )的应用程序,这特别有用。
下面的解析器将使用系统标识符 "http://www.myhost.com/today" 为应用程序提供用于实体的特定字符流:
import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; public class MyResolver implements EntityResolver { public InputSource resolveEntity (String publicId, String systemId) { if (systemId.equals("http://www.myhost.com/today")) { // return a special input source MyReader reader = new MyReader(); return new InputSource(reader); } else { // use the default behaviour return null; } } }
应用程序还可以使用此接口将系统标识符重定向到本地 URI,或者在目录中查找替换(可能使用公共标识符)。
XMLReader.setEntityResolver(org.xml.sax.EntityResolver)
,
InputSource
方法摘要 | |
---|---|
InputSource |
resolveEntity(String publicId, String systemId) 允许应用程序解析外部实体。 |
方法详细信息 |
---|
InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException
解析器将在打开任何外部实体(顶级文档实体除外)前调用此方法。此类实体包括在 DTD 内引用的外部 DTD 子集和外部参数实体(无论哪种情形,仅在在解析器都读取外部参数实体时)和在文档元素内引用的外部通用实体(如果解析器读取外部通用实体)。应用程序可以请求解析器本身定位实体、使用另外的 URI或者使用应用程序提供的数据(作为字符或字节输入流)。
应用程序编写者可以使用此方法将外部系统标识符重定向到安全的和/或本地的 URI,以便在目录中查找公共标识符或从数据库或其他输入源(其中包括对话框)中读取实体。XML 和 SAX 都不为使用公共或系统 ID 解析资源指定首选策略。但是,SAX 指定了如何解释通过此方法返回的任何 InputSource,并指定如果未返回,则系统 ID 将被重新引用为 URL。
如果系统标识符是 URL,则 SAX 解析器必须在将它报告给应用程序之前完整解析它。
publicId
- 被引用的外部实体的公共标识符,如果未提供,则为 null。
systemId
- 被引用的外部实体的系统标识符。
SAXException
- 任何 SAX 异常,可能包装另外的异常。
IOException
- 特定于 Java 的 IO 异常,可能是由于为 InputSource 创建新的 InputStream 或 Reader 所导致的。
InputSource