- 所有父级接口:
EntityResolver,LSResourceResolver,URIResolver,XMLResolver
EntityResolver 、StAX XMLResolver 、架构验证使用的 DOM LS LSResourceResolver 和转换 URIResolver 的目录解析器,并使用目录解析外部引用。
目录标准 将 external identifiers 与 uri entries 区分开来,因为它仅用于标识 DTD,而 uri entries 用于样式表和架构等其他资源。然而,诸如 XMLResolver 和 LSResourceResolver 之类的 Java API 没有进行这种区分。与现有的 Java API 一致,此 CatalogResolver 将系统标识符识别为 URI,并将搜索目录中的 system 和 uri 条目以找到匹配的条目。
在当前目录中开始搜索。如果找到匹配项,则不会进行进一步的尝试。只有在当前目录中没有匹配项时,才会考虑替代目录,包括 delegate 和 next 目录。
搜索顺序
解析器将首先搜索具有指定systemId 的条目的系统类型。系统条目包括 system 、 rewriteSystem 和 systemSuffix 条目。
如果未找到匹配项,则可以根据 prefer 属性搜索 public 个条目。
prefer 属性:如果 prefer 是公开的,并且没有通过系统条目找到匹配项,将考虑 public 条目。如果未指定,则 prefer 默认为公共(请注意,根据 OASIS 标准,系统条目将始终在公共条目之前考虑。首选公共意味着当同时指定系统和公共标识符时,将匹配公共条目。通常因此,推荐使用 prefer public。)
如果未找到与 systemId 和 public 标识符的匹配项,解析器将继续搜索具有指定 systemId 或 href 的 uri 条目。 uri 条目包括 uri、rewriteURI 和 uriSuffix 条目。
错误处理
CatalogResolver 扩展的指定检查异常的接口,包括:SAXException和IOException由EntityResolver.resolveEntity(java.lang.String, java.lang.String)XMLStreamException由XMLResolver.resolveEntity(java.lang.String, java.lang.String, java.lang.String, java.lang.String)TransformerException由URIResolver.resolve(java.lang.String, java.lang.String)
但是,仅当 javax.xml.catalog.resolve 指定为 strict 时,CatalogResolver 才会抛出 CatalogException 。对于希望处理已检查异常的应用程序,可能需要使用自定义解析器来包装 CatalogResolver 或使用 Catalog 对象实现它。
- 自从:
- 9
-
方法总结
修饰符和类型方法描述实现 URIResolver。resolveEntity(String publicId, String systemId) 实施EntityResolver。resolveEntity(String publicId, String systemId, String baseUri, String namespace) 实施XMLResolver。实施LSResourceResolver。
-
方法详情
-
resolveEntity
实施EntityResolver。该方法搜索主目录和备用目录中的目录条目,以尝试找到与指定的publicId或 systemId 的匹配项。- 指定者:
resolveEntity在接口EntityResolver中- 参数:
publicId- 被引用的外部实体的公共标识符,如果没有提供则为 nullsystemId- 被引用的外部实体的系统标识符。所有外部实体都需要系统标识符。 XML 需要所有外部实体的系统标识符,因此始终指定此值。- 返回:
-
如果找到映射,则为
InputSource对象。如果未找到映射,则在javax.xml.catalog.resolve属性设置为ignore时返回包含空Reader的InputSource对象;如果javax.xml.catalog.resolve属性设置为continue,则返回 null。 - 抛出:
CatalogException- 如果未找到映射且javax.xml.catalog.resolve指定为strict- 参见:
-
resolve
实现 URIResolver。该方法搜索主目录和备用目录中的目录条目,以尝试找到与指定的href属性匹配的项。href属性将按字面意义使用,不会尝试绝对化为base。如果值为 URN,则
href属性被识别为publicId,并用于搜索public条目。如果该值是 URI,则将其视为systemId,并用于搜索system和uri条目。- 指定者:
resolve在接口URIResolver中- 参数:
href- 指定样式表 URI 的 href 属性,可以是相对的也可以是绝对的base- 如果需要绝对 URI,则 href 属性将根据其成为绝对的基本 URI- 返回:
-
如果找到映射,则为
Source对象。如果未找到映射,则在javax.xml.catalog.resolve属性设置为ignore时返回一个空的Source对象;如果javax.xml.catalog.resolve属性设置为continue,则返回具有原始 URI 的Source对象(如果 base 不为空,则 href 或 href 由 base 解析)。 - 抛出:
CatalogException- 如果未找到映射且javax.xml.catalog.resolve指定为strict
-
resolveEntity
实施XMLResolver。为了解决publicId和systemId,此方法等同于resolveEntity(java.lang.String, java.lang.String)。systemId将按字面意义使用,不会尝试绝对化为baseUri。baseUri和namespace不用于在目录中搜索匹配项。但是,解析器可能已使用baseURI将 xml 源中的相对systemId设为绝对,从而使其无法找到system条目。在这种情况下,建议使用systemSuffix条目而不是system条目。- 指定者:
resolveEntity在接口XMLResolver中- 参数:
publicId- 被引用的外部实体的公共标识符,如果没有提供则为 nullsystemId- 被引用的外部实体的系统标识符。所有外部实体都需要系统标识符。 XML 需要所有外部实体的系统标识符,因此始终指定此值。baseUri- 绝对基础 URI,未被 CatalogResolver 使用namespace- 要解析的实体的名称空间,CatalogResolver 未使用。- 返回:
-
如果找到映射,则为
InputStream对象;如果未找到映射且javax.xml.catalog.resolve属性设置为continue或ignore则为 null。请注意,对于 XMLResolver,不可能忽略引用,因此ignore被视为与continue相同。 - 抛出:
CatalogException- 如果未找到映射且javax.xml.catalog.resolve指定为strict
-
resolveResource
LSInput resolveResource(String type, String namespaceUri, String publicId, String systemId, String baseUri) 实施LSResourceResolver。为了解决publicId和systemId,此方法等同于resolveEntity(java.lang.String, java.lang.String)。systemId将按字面意义使用,不会尝试绝对化为baseUri。baseUri、namespaceUri和type不用于在目录中搜索匹配项。但是,源中的相对systemId可能已被解析器与baseURI设为绝对,因此无法找到system条目。在这种情况下,建议使用systemSuffix条目而不是system条目。- 指定者:
resolveResource在接口LSResourceResolver中- 参数:
type- 正在解析的资源类型,CatalogResolver 未使用namespaceUri- 正在解析的资源的名称空间,CatalogResolver 未使用publicId- 被引用的外部实体的公共标识符,如果没有提供公共标识符或资源不是实体,则为null。systemId- 系统标识符,被引用的外部资源的 URI 引用baseUri- 绝对基础 URI,未被 CatalogResolver 使用- 返回:
-
如果找到映射,则为
LSInput对象;如果未找到映射且javax.xml.catalog.resolve属性设置为continue或ignore则为 null。请注意,对于LSResourceResolver,无法忽略引用,因此ignore与continue被视为相同。 - 抛出:
CatalogException- 如果未找到映射且javax.xml.catalog.resolve指定为strict
-