- 所有父级接口:
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
-