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

2022-01-19 00:00:00 xml ant java jaxb castor

我有几个重用相同实体的 XSD.例如,ProductPurchaseRequest.xsdProductQuoteRequest.xsd 的 XSD 都有一个 标签来描述产品有问题.为此,我创建了一个 Product.xsd 文件来定义 <product> 标记以及 ProductPurchaseRequest.xsdProductQuoteRequest.xsd 使用 `.

I have several XSDs that reuse the same entities. For example, both the XSDs for the ProductPurchaseRequest.xsd and ProductQuoteRequest.xsd both have a <product> tag in them to describe the product in question. For this reason I created a Product.xsd file to define the <product> tag and both ProductPurchaseRequest.xsd and ProductQuoteRequest.xsd import the Product.xsd with a `.

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

I would like to use Castor to generate Java classes from theses XSDs, and for both of them to use the same class for representing the Product so that I could reuse the same logic for mapping them to our model's ProductModel class.

Castor 能做到这一点吗?如果是这样,它的 Ant 任务语法是什么.如果不是,也许 JAXB 会是更好的选择吗?

Can Castor do this? If so, what would be the Ant task syntax for it. If not, would perhaps JAXB be a better alternative?

推荐答案

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

So I was able to get the whole thing working using the JAXB reference implementation. The trick was to realise that the download from JAXB site is a downloader and not the actual libraries! Double-click to accept the licence and the libraries will download locally. Created a test folder (JAXB_TEST) and copied all the downloaded .jars to a lib subfolder. I put all my XSDs in XSD subfolder. After that I ran the following Ant build.xml file.

<?xml version="1.0"?>
<project name="jaxb_test" basedir="." default="package" >

    <taskdef name="xjc" classname="com.sun.tools.xjc.XJCTask">
        <classpath>
            <fileset dir="./lib" includes="*.jar" />
        </classpath>
    </taskdef>

    <target name="generate">
        <delete dir="./gen-src" />
        <mkdir dir="./gen-src" />

        <xjc destdir="./gen-src" language="XMLSCHEMA" package="com.mmm" >
            <schema dir="./xsd" includes="EPC*.xsd" />
        </xjc>      
    </target>

    <target name="compile" depends="generate" >
        <delete dir="./bin" />
        <mkdir dir="./bin" />

        <javac srcdir="./gen-src" destdir="./bin" includeantruntime="false" />
    </target>

    <target name="package" depends="compile" >
        <delete dir="./dist" />
        <mkdir dir="./dist" />
        <jar destfile="./dist/jaxb-gen.jar" basedir="./bin" />
    </target>   


</project>

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

The only problem I had was that I had an xsd with a root tag called <product> that anonymous extended the Product type to add a version attribute (which I always like to have on my root tag's) which was causing a name conflict for JAXB. So instead, I turned the anonymous type into a named type (i.e. TopLevelProduct) and set the root to that type and JAXB was happy with that.

相关文章