Castor 是否可以处理从基本 XSD 导入的多个 XSD 生成的类



我有几个重用相同实体的XSD。例如,ProductPurchaseRequest.xsdProductQuoteRequest.xsd的 XSD 中都有一个 <product> 标记来描述有问题的产品。出于这个原因,我创建了一个Product.xsd文件来定义<product>标签,ProductPurchaseRequest.xsdProductQuoteRequest.xsdProduct.xsd导入带有'.

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

蓖麻能做到这一点吗?如果是这样,它的 Ant 任务语法是什么。如果没有,也许JAXB会是更好的选择吗?

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

蓖麻能做到这一点吗?如果是这样,它的 Ant 任务语法是什么。 如果没有,也许JAXB会是更好的选择吗?

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

产品

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/Product" 
    xmlns:tns="http://www.example.org/Product" 
    elementFormDefault="qualified">
    <element name="product">
        <complexType>
            <sequence>
                <element name="id" type="string"/>
                <element name="name" type="string"/>
            </sequence>
        </complexType>
    </element>
</schema>
由于多个 XML 模式导入 Product.xsd,

我们可以利用剧集文件,以便与 Product.xsd 对应的类只生成一次。

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

产品购买请求.xsd

下面是导入 Product.xsd 的 XML 架构的示例:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/ProductPurchaseRequest" 
    xmlns:tns="http://www.example.org/ProductPurchaseRequest"
    xmlns:prod="http://www.example.org/Product" 
    elementFormDefault="qualified">
    <import namespace="http://www.example.org/Product" schemaLocation="Product.xsd"/>
    <element name="purchase-request">
        <complexType>
            <sequence>
                <element ref="prod:product" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>
</schema>

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

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

产品报价请求.xsd

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

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/ProductQuoteRequest" 
    xmlns:tns="http://www.example.org/ProductQuoteRequest" 
    xmlns:prod="http://www.example.org/Product" 
    elementFormDefault="qualified">
    <import namespace="http://www.example.org/Product" schemaLocation="Product.xsd"/>
    <element name="quote">
        <complexType>
            <sequence>
                <element ref="prod:product"/>
            </sequence>
        </complexType>
    </element>
</schema>

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

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

欲了解更多信息

  • http://weblogs.java.net/blog/kohsuke/archive/2006/09/separate_compil.html
因此,

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

<?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 对此感到满意。

相关内容

  • 没有找到相关文章