3

同じエンティティを再利用する XSD がいくつかあります。たとえば、 と の両方の XSD にはProductPurchaseRequest.xsd、問題の製品を説明ProductQuoteRequest.xsdする<product>タグが含まれています。このため、タグと両方を定義Product.xsdするファイル を作成し、`.<product>ProductPurchaseRequest.xsdProductQuoteRequest.xsdProduct.xsd

Castor を使用して、これらの XSD から Java クラスを生成し、両方を表すために同じクラスを使用して、モデルのクラスProductにマッピングするために同じロジックを再利用できるようにしたいと考えています。ProductModel

キャスターはこれを行うことができますか? もしそうなら、Ant タスクの構文はどうなるでしょうか。そうでない場合、おそらく JAXB がより良い代替手段になるでしょうか?

4

2 に答える 2

6

注:私は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 に対応するクラスが 1 回だけ生成されるようにすることができます。

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

詳細については

于 2011-11-02T19:50:30.613 に答える
1

そのため、JAXB 参照実装を使用してすべてを機能させることができました。トリックは、JAXB サイトからのダウンロードがダウンローダーであり、実際のライブラリではないことを理解することでした! ダブルクリックしてライセンスに同意すると、ライブラリがローカルにダウンロードされます。テスト フォルダー ( ) を作成し、ダウンロードしたすべての をサブフォルダーにJAXB_TESTコピーしました。すべての XSD をサブフォルダーに入れました。その後、次の Antファイルを実行しました。.jarlibXSDbuild.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 があり、JAXB の名前の競合を引き起こしていProductた属性 (ルートタグに常に付けたい) を追加するために型を拡張したことでした。versionそこで代わりに、匿名型を名前付き型 (つまりTopLevelProduct) に変え、ルートをその型に設定すると、JAXB はそれに満足しました。

于 2011-11-02T21:07:45.297 に答える