Module java.xml

Interface CatalogResolver

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

public interface CatalogResolver extends EntityResolver, XMLResolver, URIResolver, LSResourceResolver
实现了SAX EntityResolver,StAX XMLResolver,DOM LS LSResourceResolver,用于模式验证的Transform URIResolver的目录解析器,通过目录解析外部引用。

目录标准外部标识符uri条目区分开来,前者仅用于标识DTD,而后者用于其他资源,如样式表和模式。然而,Java API(如XMLResolverLSResourceResolver)并没有做出这样的区分。为了与现有的Java API保持一致,此CatalogResolver将系统标识符视为URI,并将在目录中搜索systemuri条目以找到匹配的条目。

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

搜索顺序

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

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

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

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

错误处理

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

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

自版本:
9
  • Method Details

    • resolveEntity

      InputSource resolveEntity(String publicId, String systemId)
      实现了EntityResolver。该方法通过主目录和备用目录中的目录条目搜索,以尝试找到与指定的publicIdsystemId匹配的条目。
      指定者:
      resolveEntity 在接口 EntityResolver
      参数:
      publicId - 被引用的外部实体的公共标识符,如果没有提供则为null
      systemId - 被引用的外部实体的系统标识符。所有外部实体都需要系统标识符。XML要求所有外部实体都有系统标识符,因此此值始终被指定。
      返回:
      如果找到映射,则返回一个InputSource对象。如果找不到映射,则根据javax.xml.catalog.resolve属性的设置,返回一个包含空ReaderInputSource对象(如果javax.xml.catalog.resolve属性设置为ignore);如果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属性的设置,返回一个空的Source对象(如果javax.xml.catalog.resolve属性设置为ignore);如果javax.xml.catalog.resolve属性设置为continue,则返回一个带有原始URI(如果base不为null,则为href解析为base后的URI)的Source对象。
      抛出:
      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将直接使用,不会尝试将其绝对化为baseUri。在目录中查找匹配项时,不使用baseUrinamespace。然而,在xml源中,解析器可能已经使用baseURI将相对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将被直接使用,不会尝试将其绝对化为baseUri。在目录中查找匹配时,不使用baseUrinamespaceUritype。但是,在源中的相对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,不可能忽略引用,因此ignore被视为与continue相同。
      抛出:
      CatalogException - 如果未找到映射且javax.xml.catalog.resolve指定为strict