Castor可以处理从基础XSD导入的多个XSD生成类吗?

我有几个重用相同实体的XSD。 例如, ProductPurchaseRequest.xsdProductQuoteRequest.xsd的XSD都有一个标记来描述相关产品。 出于这个原因,我创建了一个Product.xsd文件来定义标签, ProductPurchaseRequest.xsdProductQuoteRequest.xsd都使用`导入Product.xsd

我想使用Castor从这些XSD生成Java类,并且两者都使用相同的类来表示Product这样我就可以重用相同的逻辑将它们映射到我们模型的ProductModel类。

Castor可以这样做吗? 如果是这样,它的Ant任务语法是什么。 如果没有,或许JAXB可能是更好的选择吗?

注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员。

Castor可以这样做吗? 如果是这样,它的Ant任务语法是什么。 如果没有, 或许JAXB可能是更好的选择吗?

下面是如何使用JAXB完成此操作的示例:

产品

            

由于多个XML模式导入Product.xsd,因此我们可以利用episode文件,以便只生成一次与Product.xsd相对应的类。

 xjc -d out -episode product.episode Product.xsd 

ProductPurchaseRequest.xsd

下面是导入Product.xsd的XML模式的示例:

            

当我们从这个XML模式生成类时,我们将引用我们从Product.xsd生成Java类时创建的剧集文件。

 xjc -d out ProductPurchaseRequest.xsd -extension -b product.episode 

ProductQuoteRequest.xsd

下面是导入Product.xsd的XML模式的另一个示例:

            

再次,当我们从这个XML模式生成类时,我们将引用我们从Product.xsd生成Java类时创建的剧集文件。

 xjc -d out ProductQuoteRequest.xsd -extension -b product.episode 

了解更多信息

所以我能够使用JAXB参考实现来完成所有工作。 诀窍是要意识到从JAXB站点 下载是一个下载器不是实际的库! 双击以接受许可证,库将在本地下载。 创建了一个测试文件夹( JAXB_TEST )并将所有下载的.jar复制到lib子文件夹。 我将所有XSD放在XSD子文件夹中。 之后,我运行了以下Ant build.xml文件。

                          

我遇到的唯一问题是我有一个带有root标签的xsd,名为 ,匿名扩展了Product类型以添加​​一个version属性(我总是喜欢在我的root标签上),这导致了JAXB的名称冲突。 因此,我将匿名类型转换为命名类型(即TopLevelProduct )并将根设置为该类型,JAXB对此感到满意。