OASIS XML Catalog 通过映射替代解决实体解析问题:用本地文件替代远程DTD/XSD,统一管理多版本依赖,屏蔽不安全来源,并需在解析器中显式启用。
OASIS
XML Catalog 是一种标准化机制,用于将 XML 文档中引用的外部实体(如 DTD、XSD、实体文件)重定向到本地或受控路径,从而解决网络不可达、加载缓慢、安全风险和环境不一致等问题。
XML 解析器在遇到 ..> 或 xsi:schemaLocation 等声明时,会尝试按原始 URI(如 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd)下载资源。若网络中断、URL 失效或策略禁止外连,解析就会失败。Catalog 通过“映射替代”绕过真实网络请求:
-//W3C//DTD XHTML 1.0 Transitional//EN 映射到项目内的 dtds/xhtml1-transitional.dtd
把所有 https://api.example.com/v1/ 开头的 Schema 请求,自动重写为 ./schemas/v1/
一个标准 Catalog(如 catalog.xml)使用 OASIS 命名空间,常见元素有:
:匹配 DOCTYPE 中的 Public ID,例如 publicId="-//W3C//DTD XHTML 1.0 Strict//EN" → uri="dtds/xhtml1-strict.dtd"
:精确匹配 SYSTEM 标识符(完整 URI),例如 systemId="https://example.com/config.xsd" → uri="schemas/config.xsd"
:前缀匹配并重写,适合批量迁移,例如 systemIdStartString="https://old-api.com/" → rewritePrefix="./schemas/old/"
仅写好 Catalog 文件还不够,必须在代码中显式启用:
SAXParser 或 DocumentBuilder 的 EntityResolver 属性为 CatalogResolver("catalog.xml")
XmlResolver 子类,在 ResolveUri 中调用 Catalog 解析逻辑,再赋值给 XmlDocument.XmlResolver
--catalog=catalog.xml 参数启用直接在 XML 里写 SYSTEM "local/schema.xsd" 看似简单,但会导致: