模块  java.xml
软件包  org.xml.sax.ext

Interface EntityResolver2

  • 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 StyleTransitional Mode应用程序都可以与任何SAX2解析器一起使用。 除了支持此特定功能的SAX2解析器之外, 新样式应用程序将无法运行。 他们将坚持功能标志的值为“true”,如果调用原始的SAX 1.0样式实体解析方法,它们提供的EntityResolver2实现可能会抛出异常。

    从以下版本开始:
    1.5,SAX 2.0(扩展1.1 alpha)
    另请参见:
    XMLReader.setEntityResolver(org.xml.sax.EntityResolver)
    • 方法详细信息

      • 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()返回的任何外部实体。 当(非验证)处理器通过使用特征标志配置为不包括一类实体(参数或通用)时,不会为这些实体调用此方法。

        请注意,此处使用的实体命名方案与LexicalHandlerContentHandler.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。