模块 java.xml

接口 CatalogResolver

所有父级接口:
EntityResolver , LSResourceResolver , URIResolver , XMLResolver

public interface CatalogResolver extends EntityResolver , XMLResolver , URIResolver , LSResourceResolver
实现 SAX EntityResolver 、StAX XMLResolver 、架构验证使用的 DOM LS LSResourceResolver 和转换 URIResolver 的目录解析器,并使用目录解析外部引用。

目录标准external identifiersuri entries 区分开来,因为它仅用于标识 DTD,而 uri entries 用于样式表和架构等其他资源。然而,诸如 XMLResolver LSResourceResolver 之类的 Java API 没有进行这种区分。与现有的 Java API 一致,此 CatalogResolver 将系统标识符识别为 URI,并将搜索目录中的 systemuri 条目以找到匹配的条目。

在当前目录中开始搜索。如果找到匹配项,则不会进行进一步的尝试。只有在当前目录中没有匹配项时,才会考虑替代目录,包括 delegate 和 next 目录。

搜索顺序

解析器将首先搜索具有指定 systemId 的条目的系统类型。系统条目包括 systemrewriteSystemsystemSuffix 条目。

如果未找到匹配项,则可以根据 prefer 属性搜索 public 个条目。

prefer 属性:如果 prefer 是公开的,并且没有通过系统条目找到匹配项,将考虑 public 条目。如果未指定,则 prefer 默认为公共(请注意,根据 OASIS 标准,系统条目将始终在公共条目之前考虑。首选公共意味着当同时指定系统和公共标识符时,将匹配公共条目。通常因此,推荐使用 prefer public。)

如果未找到与 systemIdpublic 标识符的匹配项,解析器将继续搜索具有指定 systemIdhrefuri 条目。 uri 条目包括 urirewriteURIuriSuffix 条目。

错误处理

CatalogResolver 扩展的指定检查异常的接口,包括:

但是,仅当 javax.xml.catalog.resolve 指定为 strict 时,CatalogResolver 才会抛出 CatalogException 。对于希望处理已检查异常的应用程序,可能需要使用自定义解析器来包装 CatalogResolver 或使用 Catalog 对象实现它。

自从:
9
  • 方法详情

    • resolveEntity

      InputSource  resolveEntity(String  publicId, String  systemId)
      实施 EntityResolver 。该方法搜索主目录和备用目录中的目录条目,以尝试找到与指定的 publicId 或 systemId 的匹配项。
      指定者:
      resolveEntity 在接口 EntityResolver
      参数:
      publicId - 被引用的外部实体的公共标识符,如果没有提供则为 null
      systemId - 被引用的外部实体的系统标识符。所有外部实体都需要系统标识符。 XML 需要所有外部实体的系统标识符,因此始终指定此值。
      返回:
      如果找到映射,则为 InputSource 对象。如果未找到映射,则在 javax.xml.catalog.resolve 属性设置为 ignore 时返回包含空 Reader InputSource 对象;如果 javax.xml.catalog.resolve 属性设置为 continue,则返回 null。
      抛出:
      CatalogException - 如果未找到映射且 javax.xml.catalog.resolve 指定为 strict
      参见:
    • resolve

      Source  resolve(String  href, String  base)
      实现 URIResolver。该方法搜索主目录和备用目录中的目录条目,以尝试找到与指定的 href 属性匹配的项。 href 属性将按字面意义使用,不会尝试绝对化为 base

      如果值为 URN,则 href 属性被识别为 publicId ,并用于搜索 public 条目。如果该值是 URI,则将其视为 systemId,并用于搜索 systemuri 条目。

      指定者:
      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

      InputStream  resolveEntity(String  publicId, String  systemId, String  baseUri, String  namespace)
      实施 XMLResolver 。为了解决 publicIdsystemId ,此方法等同于 resolveEntity(java.lang.String, java.lang.String)

      systemId 将按字面意义使用,不会尝试绝对化为 baseUribaseUrinamespace 不用于在目录中搜索匹配项。但是,解析器可能已使用 baseURI 将 xml 源中的相对 systemId 设为绝对,从而使其无法找到 system 条目。在这种情况下,建议使用 systemSuffix 条目而不是 system 条目。

      指定者:
      resolveEntity 在接口 XMLResolver
      参数:
      publicId - 被引用的外部实体的公共标识符,如果没有提供则为 null
      systemId - 被引用的外部实体的系统标识符。所有外部实体都需要系统标识符。 XML 需要所有外部实体的系统标识符,因此始终指定此值。
      baseUri - 绝对基础 URI,未被 CatalogResolver 使用
      namespace - 要解析的实体的名称空间,CatalogResolver 未使用。
      返回:
      如果找到映射,则为 InputStream 对象;如果未找到映射且 javax.xml.catalog.resolve 属性设置为 continueignore 则为 null。请注意,对于 XMLResolver,不可能忽略引用,因此 ignore 被视为与 continue 相同。
      抛出:
      CatalogException - 如果未找到映射且 javax.xml.catalog.resolve 指定为 strict
    • resolveResource

      LSInput  resolveResource(String  type, String  namespaceUri, String  publicId, String  systemId, String  baseUri)
      实施 LSResourceResolver 。为了解决 publicIdsystemId ,此方法等同于 resolveEntity(java.lang.String, java.lang.String)

      systemId 将按字面意义使用,不会尝试绝对化为 baseUribaseUrinamespaceUritype 不用于在目录中搜索匹配项。但是,源中的相对 systemId 可能已被解析器与 baseURI 设为绝对,因此无法找到 system 条目。在这种情况下,建议使用 systemSuffix 条目而不是 system 条目。

      指定者:
      resolveResource 在接口 LSResourceResolver
      参数:
      type - 正在解析的资源类型,CatalogResolver 未使用
      namespaceUri - 正在解析的资源的名称空间,CatalogResolver 未使用
      publicId - 被引用的外部实体的公共标识符,如果没有提供公共标识符或资源不是实体,则为 null
      systemId - 系统标识符,被引用的外部资源的 URI 引用
      baseUri - 绝对基础 URI,未被 CatalogResolver 使用
      返回:
      如果找到映射,则为 LSInput 对象;如果未找到映射且 javax.xml.catalog.resolve 属性设置为 continueignore 则为 null。请注意,对于 LSResourceResolver ,无法忽略引用,因此 ignorecontinue 被视为相同。
      抛出:
      CatalogException - 如果未找到映射且 javax.xml.catalog.resolve 指定为 strict