2

私は次のXSDを持っています(この質問をするため):

  <xsd:complexType name="BaseType" abstract="true">
    <xsd:sequence>
      <xsd:element name="field1" type="xsd:string"/>
      <xsd:element name="field2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="ExtendedType">
    <xsd:complexContent>
      <xsd:extension base="tns:BaseType">
        <xsd:sequence>
          <xsd:element name="fieldA" type="xsd:string"/>
          <xsd:element name="fieldB" type="xsd:string"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="extendedType" type="tns:ExtendedType"/>

これにより、次のような XML ファイルが可能になります。

<extendedType>
  <field1>hello</field1>
  <field2>world</field2>
  <fieldA>aaa</fieldA>
  <fieldB>bbb</fieldB>
</extendedType>

つまり、2 つのニュース フィールド fieldA と fieldB が BaseType の下部に追加されます。

BaseType を拡張する方法はありますが、一番上に fieldA を挿入し、一番下に fieldB を挿入しますか? これが機能するように?

<extendedType>
  <fieldA>aaa</fieldA>
  <field1>hello</field1>
  <field2>world</field2>
  <fieldB>bbb</fieldB>
</extendedType>

JAXBを期待どおりに機能させる方法は?

4

2 に答える 2

4

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#Complex_Type_Definition

他の定義のコンテンツ モデルの末尾に追加のコンテンツ モデル パーティクルを配置するか、追加の属性宣言を配置するか、またはその両方を行うことにより、別の複合型を拡張します。

  • 注: この仕様では追加のみが許可され、他の種類の拡張は許可されません。この決定により、インスタンスを派生型から基本型にキャストするために必要なアプリケーション処理が簡素化されます。将来のバージョンでは、より多くの種類の拡張が可能になる可能性があり、キャストを有効にするためにより複雑な変換が必要になります。

したがって、タイプを拡張する場合、フィールドは下部にのみ追加されます。

ハック:拡張型のフィールドが一番上に表示されます。つまり、拡張タイプに追加されたフィールドは上部に追加されます。そのため、3 つのレベルの型を持つことができます。トップの「ダミー」レベル (トップ フィールド用)、継承したいフィールドを含む中間レベル、ボトム レベル (ボトム フィールド用) です。これをインポートするスキーマは、最下位レベルとredefine最上位レベルを定義します。これにより、上部と下部にフィールドを追加できます。これに関する大きな 問題は、それを拡張する他のすべてのタイプのトップレベルも再定義することです...したがって、これらの余分なフィールドがいたるところに発生しますが、これはおそらくあなたが望むものではありません.

その他の代替手段としては、次のようなものがあります: 拡張メカニズムを回避し、代わりに使用しますsubstitution groups(ただし、これらには異なる要素名が必要です)。または、要素内に独自のポリモーフィズム ( <choice>) と継承 (<group ref="..."/>上部と下部) を作成します。ただし、すべての選択を一意に開始するか、UPA ルールに違反する必要があることに注意してください (これらは のように属性によって区別されないためxsi:type)。

編集別の回答がすでにこのビットをカバーしていることがわかります。これはすべて入力済みであり、追加の提案がいくつかあるので、そのままにしておくこともできます。

于 2012-12-03T14:07:46.047 に答える
2

アップデート

以下は、XMLスキーマ仕様の関連するステートメントです。

2.2.1.3複合型の定義http://www.w3.org/TR/xmlschema-1/#Complex_Type_Definition

別の定義を拡張する複合型は、他の定義のコンテンツモデルの最後に追加のコンテンツモデルパーティクルを含めるか、追加の属性宣言を行うか、またはその両方を行います。


XMLスキーマに対して有効であるためには、拡張フィールドは継承されたフィールドの後に発生する必要があります。マーシャリングされていない場合、要素は任意の順序にすることができます。POJOから開始する場合は、親クラスにマークを付けて@XmlTransient、親プロパティが子の一部として扱われるようにし、子のプロパティに含めることができるようにすることができますpropOrder

詳細については

于 2012-12-03T11:12:14.620 に答える