我有一个xsd,它具有导入其他xsd文件的典型import语句,但不幸的是,引用是硬编码路径。在JAXB中是否有办法使用xbj文件覆盖这些导入的位置?
所有这些xsds都是通过另一个jar(在jar中)传递的,所以我想从类路径中获取一个,当它导入其他时尝试配置它以便其他人离开类路径。
感谢, 迪安
答案 0 :(得分:9)
您可以使用多种技术来解决此问题:
<强>目录强>
您可以使用目录文件覆盖架构位置。以下是几个例子:
根据命名空间使用另一个架构:
PUBLIC "http://example.org/A" "others/schema_a.xsd"
根据架构位置使用其他架构:
REWRITE_SYSTEM "https://example.org/a.xsd" "others/schema_a.xsd"
允许您使用模式文件的本地副本。
请参阅this和this指南。 不幸的是,XJC中的目录支持并不总是按预期工作,而且调试起来有点困难。
解决Maven工件中的模式
如果你正在使用Maven,你可以使用maven-jaxb2-plugin来解析Maven工件中的模式:
REWRITE_SYSTEM "https://example.org/a.xsd" "maven:org.example:a!/a.xsd"
结合目录,您可以在a.xsd
内使用a-XXX.jar
代替https://example.org/a.xsd
使用JAXB。
请参阅以下示例项目:
答案 1 :(得分:1)
您可以尝试以编程方式与XJC交互(请参阅下文)并插入您自己的EntityResolver来解析XML模式:
import com.sun.codemodel.*;
import com.sun.tools.xjc.*;
import com.sun.tools.xjc.api.*;
SchemaCompiler sc = XJC.createSchemaCompiler();
sc.setEntityResolver(new YourEntityResolver());
sc.setErrorListener(new YourErrorListener());
sc.parseSchema(SYSTEM_ID, element);
S2JJAXBModel model = sc.bind();
以下是我给出的相关答案的链接,其中有些人认为有用: