3

件名のような質問:XSDで同じ名前の要素にネストされた要素を定義することは有効ですか?

例として、次のスニペットは正しいですか?

<xs:element name="TypeOfAction" minOccurs="0">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="TypeOfAction" minOccurs="0">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="code" type="xs:string"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

もしそうなら、どのようにしてxjcを作成して、そのためのクラスを適切に生成しますか?静的クラスがすでに定義されているようなコンパイルエラーが発生しましたTypeOfAction(基本的に、同じ名前の2つのネストされた静的クラスが生成されます)。

4

1 に答える 1

5

スニペットは問題ありません。グローバル要素のみが一意の修飾名(名前空間とローカル名の組み合わせ)を持つ必要があります。

JDK 7のXJCは、スニペットで正常に動作します。私のサンプルXSDは正しいクラスを生成します。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:complexType name="SomeType">
        <xs:sequence>
            <xs:element name="TypeOfAction" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="TypeOfAction"
                            minOccurs="0">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute name="code"
                                            type="xs:string" />
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema> 

ただし、Javaでは外部クラスと同じ名前の内部クラスを宣言できないため、コンパイルされません。xjcバインディングまたはインラインスキーマアノテーションを使用して、生成されたタイプ名を変更してみてください。ここに例があります。

インラインバインディングのサンプル:

...
<xs:element name="TypeOfAction"
    minOccurs="0">
    <xs:complexType>
        <xs:annotation>
            <xs:appinfo>
                <jaxb:class name="InnerTypeOfAction" />
            </xs:appinfo>
        </xs:annotation>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="code"
                    type="xs:string" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element>
...
于 2012-12-27T21:27:52.597 に答える