这是我为maven-jaxb2-plugin编写的解析器。此解析器将系统 ID 解析为 Maven 工件中的资源。这与您的任务有些相似。
这是另一个在类路径中解析的解析器的简单代码片段classpath:com/acme/foo/schema.xsd
:
public static final String URI_SCHEME_CLASSPATH = "classpath";
@Override
public String getResolvedEntity(String publicId, String systemId) {
final String result = super.getResolvedEntity(publicId, systemId);
if (result == null) {
return null;
}
try {
final URI uri = new URI(result);
if (URI_SCHEME_CLASSPATH.equals(uri.getScheme())) {
final String schemeSpecificPart = uri.getSchemeSpecificPart();
final URL resource = Thread.currentThread()
.getContextClassLoader()
.getResource(schemeSpecificPart);
if (resource == null) {
return null;
} else {
return resource.toString();
}
} else {
return result;
}
} catch (URISyntaxException urisex) {
return result;
}
}
在您的情况下,我会执行以下操作:
- 定义 URI 模式,如
database:schema:table:value:id:schema.xsd
.
- 编写一个能够解析此类 URI 的目录解析器。
- 定义一个目录文件,它将命名空间 URI 或绝对模式位置 URL 重写为您的
database:...
URI。
简而言之,这将类似于:
REWRITE_SYSTEM "http://example.com/schemas" "database:schemas:content:schema_id:example/schemas"
- 因此,“基本”目录解析器将首先解析
http://example.com/schemas/schema.xsd
为database:schemas:content:schema_id:example/schemas/schema.xsd
.
- 然后您的代码解析
database:schemas:content:schema_id:example/schemas/schema.xsd
为数据库资源。