5

xsd スキーマから Java クラスを生成しようとしていますが、JAXB を使用しています。ほとんどの場合、プロセスを実行してクラスを生成すると、機能します。ただし、メンバー変数、 getter 、および setter が生成されないクラスがいくつかあります。これが私が持っているものです

ファイル ns2.xsd

<xs:element name="Observation" type="ns2:ObservationType" substitutionGroup="ns1:_MetaData"/>
<xs:complexType name="ObservationType" mixed="true">
    <xs:complexContent mixed="true">
        <xs:extension base="ns1:AbstractType">
            <xs:sequence>
                    <xs:element ref="ns2:identifier"/>

            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

ファイル ns3.xsd

<xs:element name="Observation" type="ns3:ObservationType" substitutionGroup="ns2:Observation"/>
<xs:complexType name="ObservationType" mixed="true">
    <xs:annotation>
        <xs:documentation>this extends the ns2:ObservationType </xs:documentation>
    </xs:annotation>
    <xs:complexContent mixed="true">
        <xs:extension base="ns2:ObservationType">
            <xs:sequence>
                <xs:element ref="ns3:deliveryInfo" minOccurs="0"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

これにより、空のクラスが作成されます

package mypackage.ns3;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
 * this extends the ns2:ObservationType 
 * 
 * <p>Java class for ObservationType complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="ObservationType">
 *   &lt;complexContent>
 *     &lt;extension base="{http://earth.esa.int/ns2}ObservationType">
 *       &lt;sequence>
 *         &lt;element ref="{http://earth.esa.int/ns3}deliveryInfo" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ObservationType")
public class ObservationType
    extends mypackage.ns2.ObservationType
{


}

私の質問は、必要なメンバー変数とそのセッターとゲッターを作成しないのはなぜですか? スキーマに何か問題がありますか、それとも JAXB に制限があり、異なるファイルの拡張子を使用する複雑な型から欠落している情報を作成できますか? 前もって感謝します。あなたの助けやコメントをいただければ幸いです。

4

1 に答える 1

2

この使用例を奇妙にしているのは、混合コンテンツを持つ 2 つの型の間で XML スキーマに継承があることです。ここに XJC (およびおそらく仕様) のバグがあると思います。Puce が提案したように、次のリンクでバグを入力する必要があります。

XML スキーマ

スキーマ.xsd

同じ問題を再現する単純な XML スキーマを次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <complexType name="b" mixed="true">
                 <sequence>
                   <element ref="tns:bb"/>
                </sequence>
    </complexType>


    <complexType name="c">
        <complexContent mixed="true">
            <extension base="tns:b">
                <sequence>
                   <element ref="tns:cc"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

    <element name="bb" type="string"/>

    <element name="cc" type="string"/>

</schema>

不適切な Java モデル

B

タイプに対して生成されたクラスbは問題ありません。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "b", propOrder = {"content"})
@XmlSeeAlso({C.class})
public class B {

    @XmlElementRef(name = "bb", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }

}

タイプに対して生成されたクラスcが間違っています。問題は、それがどうあるべきかということです。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C extends B {


}

より良い Java モデル? - オプション1

Cクラスにプロパティを追加できます。問題は、混合テキストのどれが から継承Bされたプロパティに入り、どれが で定義されたプロパティに入るかということになりますC

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C
    extends B
{

    @XmlElementRef(name = "cc", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content2;

}

より良い Java モデル? - オプション #2

プロパティを拡張して、型Bからの要素参照を認識することができます。これにより、およびタイプcの XML を正しく処理できるようになりますが、XML スキーマに対して有効でなかった一部のドキュメントが許可されます。bc

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "b", propOrder = {"content"})
@XmlSeeAlso({C.class})
public class B {

    @XmlElementRefs({
        @XmlElementRef(name = "bb", namespace = "http://www.example.org/schema", type = JAXBElement.class),
        @XmlElementRef(name = "cc", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    })
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }

}
于 2013-07-31T20:52:48.193 に答える