jaxb - 如何将xsd文件映射到URL以查找它们

时间:2012-03-20 15:28:23

标签: jaxb xjc

我有一个xsd,它具有导入其他xsd文件的典型import语句,但不幸的是,引用是硬编码路径。在JAXB中是否有办法使用xbj文件覆盖这些导入的位置?

所有这些xsds都是通过另一个jar(在jar中)传递的,所以我想从类路径中获取一个,当它导入其他时尝试配置它以便其他人离开类路径。

感谢, 迪安

2 个答案:

答案 0 :(得分:9)

您可以使用多种技术来解决此问题:

<强>目录

您可以使用目录文件覆盖架构位置。以下是几个例子:

根据命名空间使用另一个架构:

PUBLIC "http://example.org/A" "others/schema_a.xsd"

根据架构位置使用其他架构:

REWRITE_SYSTEM "https://example.org/a.xsd" "others/schema_a.xsd"

允许您使用模式文件的本地副本。

请参阅thisthis指南。 不幸的是,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();

以下是我给出的相关答案的链接,其中有些人认为有用: