-
- All Superinterfaces:
-
EntityResolver
- 所有已知实现类:
-
DefaultHandler2
public interface EntityResolver2 extends EntityResolver
扩展接口,用于将外部实体引用映射到输入源,或提供缺少的外部子集。XMLReader.setEntityResolver()
方法用于为解析器提供此接口的实现。 当解析器使用此接口中的方法时,将使用EntityResolver2.resolveEntity()
方法(在此接口中) 而不是旧的(SAX 1.0)EntityResolver.resolveEntity()
方法。This module, both source code and documentation, is in the Public Domain, and comes with NO WARRANTY.
如果SAX应用程序需要此接口为外部实体定义的自定义处理,则必须确保它使用XMLReader并将http://xml.org/sax/features/use-entity-resolver2功能标志设置为true (其中是识别特征时的默认值)。 如果该标志无法识别,或其值为false,或者解析器未实现此接口,则仅使用
EntityResolver
方法。这支持三类修改实体解析的应用程序。 旧式应用程序不会知道这个接口; 他们将提供EntityResolver。 过渡模式提供EntityResolver2,并且由于多态性,在任何支持它的系统(解析器或其他工具)中自动获得其方法的好处。 Old Style和Transitional Mode应用程序都可以与任何SAX2解析器一起使用。 除了支持此特定功能的SAX2解析器之外, 新样式应用程序将无法运行。 他们将坚持功能标志的值为“true”,如果调用原始的SAX 1.0样式实体解析方法,它们提供的EntityResolver2实现可能会抛出异常。
- 从以下版本开始:
- 1.5,SAX 2.0(扩展1.1 alpha)
- 另请参见:
-
XMLReader.setEntityResolver(org.xml.sax.EntityResolver)
-
-
方法摘要
所有方法 实例方法 抽象方法 变量和类型 方法 描述 InputSource
getExternalSubset(String name, String baseURI)
允许应用程序为未明确定义文档的文档提供外部子集。InputSource
resolveEntity(String name, String publicId, String baseURI, String systemId)
允许应用程序将对外部实体的引用映射到输入源,或告诉解析器它应该使用传统的URI解析。-
声明方法的接口 org.xml.sax.EntityResolver
resolveEntity
-
-
-
-
方法详细信息
-
getExternalSubset
InputSource getExternalSubset(String name, String baseURI) throws SAXException, IOException
允许应用程序为未明确定义文档的文档提供外部子集。 具有省略外部子集的DOCTYPE声明的文档因此可以增加可用于验证,实体处理和属性处理的声明(规范化,默认和报告类型,包括ID)。 通过startDTD()
方法报告此增强,就像文档文本最初包含外部子集一样; 在报告任何内部子集数据或错误之前进行此回调。此方法也可以与没有DOCTYPE声明的文档一起使用。 遇到根元素但未看到DOCTYPE声明时,将调用此方法。 如果它返回外部子集的值,则该根元素被声明为根元素,从而产生在文档的序言末尾拼接DOCTYPE声明的效果,否则该元素无效。 在这种情况下,解析器回调的顺序在逻辑上类似于:
... comments and PIs from the prolog (as usual) startDTD ("rootName", source.getPublicId (), source.getSystemId ()); startEntity ("[dtd]"); ... declarations, comments, and PIs from the external subset endEntity ("[dtd]"); endDTD (); ... then the rest of the document (as usual) startElement (..., "rootName", ...);
请注意,InputSource没有进一步的解决方案。 该方法的实现可能希望调用
resolveEntity()
以获得诸如使用DTD实体的本地高速缓存之类的益处。 此外,该方法永远不会被不包括外部参数实体的(非验证)处理器使用。此方法的用途包括在与XML处理器互操作时促进数据验证,这些处理器总是需要对外部实体进行不期望的网络访问,或者由于其他原因采用“无DTD”策略。 非验证动机包括强制文档包含DTD,以便一致地处理属性。 例如,XPath处理器需要知道哪些属性具有类型“ID”,然后才能处理广泛使用的类型的引用。
警告:返回外部子集会修改输入文档。 通过提供一般实体的定义,可以使格式错误的文档看起来很好。
- 参数
-
name
- 标识文档根元素。 此名称来自DOCTYPE声明(如果可用)或来自实际的根元素。 -
baseURI
- 文档的基URI,用作选择外部子集的附加提示。 这始终是一个绝对URI,除非它是null,因为XMLReader被赋予了一个没有的InputSource。 - 结果
- 一个InputSource对象,描述解析器使用的新外部子集,或null,表示没有提供外部子集。
- 异常
-
SAXException
- 任何SAX异常,可能包含另一个异常。 -
IOException
- 可能表示无法创建新的InputStream或Reader或非法URL。
-
resolveEntity
InputSource resolveEntity(String name, String publicId, String baseURI, String systemId) throws SAXException, IOException
允许应用程序将对外部实体的引用映射到输入源,或告诉解析器它应该使用传统的URI解析。 仅对已正确声明的外部实体调用此方法。 此方法比EntityResolver
接口提供更大的灵活性,支持更复杂的目录方案的实现,例如OASIS XML Catalogs规范定义的目录方案。配置为使用此解析程序方法的解析器将调用它以确定用于因XML文本中的引用而包含的任何外部实体的输入源。 这不包括文档实体和
getExternalSubset()
返回的任何外部实体。 当(非验证)处理器通过使用特征标志配置为不包括一类实体(参数或通用)时,不会为这些实体调用此方法。请注意,此处使用的实体命名方案与
LexicalHandler
或ContentHandler.skippedEntity()
方法中使用的实体命名方案相同。- 参数
-
name
- 标识要解析的外部实体。 外部子集的“[dtd]”或者以“%”开头的名称表示参数实体,或者是一般实体的名称。 当SAX2解析器调用时,它永远不会为null。 -
publicId
- 正在引用的外部实体的公共标识符(根据XML规范的要求进行规范化),如果没有提供,则为null。 -
baseURI
- 解释相对systemID的URI。 这始终是一个绝对URI,除非它是null(可能是因为XMLReader没有给出一个InputSource)。 此URI由XML规范定义为与启动相关声明的“<”相关联的URI。 -
systemId
- 被引用的外部实体的系统标识符; 相对URI或绝对URI。 当SAX2解析器调用时,它永远不会为null; 只有声明的实体和任何外部子集才会被这样的解析器解析。 - 结果
- 一个InputSource对象,描述解析器要使用的新输入源。 返回null将指示解析器针对基URI解析系统ID并打开与结果URI的连接。
- 异常
-
SAXException
- 任何SAX异常,可能包含另一个异常。 -
IOException
- 可能表示无法创建新的InputStream或Reader或非法URL。
-
-