- 所有超级接口:
-
EntityResolver
,LSResourceResolver
,URIResolver
,XMLResolver
EntityResolver
,StAX XMLResolver
,DOM LS LSResourceResolver
,用于模式验证的Transform URIResolver
的目录解析器,通过目录解析外部引用。
目录标准将外部标识符
与uri条目
区分开来,前者仅用于标识DTD,而后者用于其他资源,如样式表和模式。然而,Java API(如XMLResolver
和LSResourceResolver
)并没有做出这样的区分。为了与现有的Java API保持一致,此CatalogResolver将系统标识符视为URI,并将在目录中搜索system
和uri
条目以找到匹配的条目。
搜索从当前目录开始。如果找到匹配项,则不会进行进一步尝试。只有在当前目录中找不到匹配项时,才会考虑替代目录,包括委托和下一个目录。
搜索顺序
解析器首先搜索具有指定systemId
的系统类型条目。系统条目包括system
、rewriteSystem
和systemSuffix
条目。
如果找不到匹配项,则可能根据prefer
属性搜索public
条目。
prefer
属性:如果prefer
为public,并且通过系统条目找不到匹配项,则将考虑public
条目。如果未指定,则prefer
默认为public(请注意,根据OASIS标准,系统条目将始终在公共条目之前考虑。优先使用公共意味着当同时指定系统和公共标识符时将匹配公共条目。因此,通常建议优先使用公共。)
如果在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)
然而,CatalogResolver仅在将javax.xml.catalog.resolve
指定为strict
时才会抛出CatalogException
。对于期望处理已检查异常的应用程序,可能需要使用自定义解析器来包装CatalogResolver或使用Catalog
对象来实现它。
- 自版本:
- 9
-
Method Summary
Modifier and TypeMethodDescription实现了URIResolver。resolveEntity
(String publicId, String systemId) 实现了EntityResolver
。resolveEntity
(String publicId, String systemId, String baseUri, String namespace) 实现了XMLResolver
。
-
Method Details
-
resolveEntity
- 指定者:
-
resolveEntity
在接口EntityResolver
中 - 参数:
-
publicId
- 被引用的外部实体的公共标识符,如果没有提供则为null -
systemId
- 被引用的外部实体的系统标识符。所有外部实体都需要系统标识符。XML要求所有外部实体都有系统标识符,因此此值始终被指定。 - 返回:
-
如果找到映射,则返回一个
InputSource
对象。如果找不到映射,则根据javax.xml.catalog.resolve
属性的设置,返回一个包含空Reader
的InputSource
对象(如果javax.xml.catalog.resolve
属性设置为ignore
);如果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
属性的设置,返回一个空的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
实现了XMLResolver
。为了解析publicId
和systemId
,此方法等同于resolveEntity(java.lang.String, java.lang.String)
。systemId
将直接使用,不会尝试将其绝对化为baseUri
。在目录中查找匹配项时,不使用baseUri
和namespace
。然而,在xml源中,解析器可能已经使用baseURI
将相对systemId
绝对化,从而无法找到system
条目。在这种情况下,建议使用systemSuffix
条目而不是system
条目。- 指定由:
-
resolveEntity
在接口XMLResolver
- 参数:
-
publicId
- 外部实体的公共标识符,如果没有提供则为null -
systemId
- 外部实体的系统标识符。所有外部实体都需要一个系统标识符。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
-