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

时间:2011-11-02 19:17:29

标签: java xml ant jaxb castor

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

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

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

2 个答案:

答案 0 :(得分:6)

注意:我是EclipseLink JAXB (MOXy)主管,是JAXB 2 (JSR-222)专家组的成员。

  

Castor可以这样做吗?如果是这样,它的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

<强> ProductPurchaseRequest.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

<强> ProductQuoteRequest.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

了解更多信息

答案 1 :(得分:1)

所以我能够使用JAXB参考实现完成所有工作。诀窍是要意识到JAXB site的下载是下载程序不是实际的库!双击以接受许可证,库将在本地下载。创建了一个测试文件夹(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对此感到满意。