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,并且由于多态性,在任何支持它的系统(解析器或其他工具)中自动获得其方法的好处。 旧样式和过渡模式应用程序都可以与任何SAX2解析器配合使用。 除了支持该特定功能的SAX2解析器之外, 新样式应用程序将无法运行。 他们会坚持feature标志的值为“true”,如果调用了原来的SAX 1.0风格的实体解析方法,它们提供的EntityResolver2实现可能会引发异常。
XMLReader.setEntityResolver(org.xml.sax.EntityResolver)
| Modifier and Type | Method and Description |
|---|---|
InputSource |
getExternalSubset(String name, String baseURI)
允许应用程序为未明确定义的文档提供外部子集。
|
InputSource |
resolveEntity(String name, String publicId, String baseURI, String systemId)
允许应用程序将对外部实体的引用映射到输入源中,或者告诉解析器它应该使用传统的URI解析。
|
resolveEntityInputSource getExternalSubset(String name, String baseURI) throws SAXException, IOException
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处理器需要知道哪些attibutes具有类型“ID”才能处理广泛使用的引用类型。
警告:返回外部子组修改输入文档。 通过为一般实体提供定义,可以使格式错误的文档看起来形成良好。
name - 标识文档根元素。
该名称来自DOCTYPE声明(如果可用)或实际根元素。
baseURI - 文档的基本URI,作为选择外部子集的附加提示。
这总是一个绝对的URI,除非它是null,因为XMLReader没有一个InputSource。
SAXException - 任何SAX异常,可能包装另一个异常。
IOException - 可能表示无法创建新的InputStream或Reader或非法URL。
InputSource resolveEntity(String name, String publicId, String baseURI, String systemId) throws SAXException, IOException
EntityResolver接口提供更多的灵活性 ,支持更复杂的目录方案的实现,例如由OASIS XML Catalogs规范定义的目录方案。
配置为使用此解析器方法的解析器将调用它来确定由于XML文本中的引用而被包含的任何外部实体使用的输入源。 不包括文件实体,以及getExternalSubset()返回的任何外部实体。 当(非验证)处理器配置为不通过使用特征标记包括一类实体(参数或一般)时,不会为此类实体调用此方法。
请注意,这里使用的实体命名方案与LexicalHandler或ContentHandler.skippedEntity()方法中使用的实体命名方案相同。
name - 标识正在解析的外部实体。
外部子集的“[dtd]”或以“%”开头的名称表示参数实体,或者是一般实体的名称。
当SAX2解析器调用时,这从不为空。
publicId - 被引用的外部实体的公共标识符(按照XML规范的要求进行规范化),如果没有提供,则为null。
baseURI - 相对于哪个相对的系统ID进行解释的URI。
这绝对是一个绝对URI,除非它是null(可能是因为XMLReader没有一个InputSource)。
该URI由XML规范定义为与启动相关声明的“<”相关联的URI。
systemId - 被引用的外部实体的系统标识符;
一个相对或绝对的URI。
当SAX2解析器调用时,这不会为空;
只有声明的实体和任何外部子集才能被这样的解析器解析。
SAXException - 任何SAX异常,可能包装另一个异常。
IOException - 可能表示无法创建新的InputStream或Reader或非法URL。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.