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