2011-12-21 4 views
2

私はJaxB Worldの新しいコーナーであり、私は1つの問題w.r.tに直面しています。格納されたXMLコンテンツをJavaクラスオブジェクトにアンマーシャリングします。問題の説明は次のとおりです。私はこれが解ける であれば、私は次の内容が含まれている私のXSDファイル(これは単なる一例です) 学生情報 具体的なインスタンスに基づくアンマーシャリング

<xs:complexType name="specialization" abstract="true"> 
    </xs:complexType> 


    <xs:complexType name="Engineering"> 
     <xs:complexContent> 
      <xs:extension base="specialization"> 
       <xs:sequence> 
        <xs:element name="percentage" type="xs:int" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="Medical"> 
     <xs:complexContent> 
      <xs:extension base="specialization"> 
       <xs:sequence> 
        <xs:element name="grade" type="xs:string" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
</xs:complexType> 

今、すべての対応するJavaを持って知ってみましょうクラスはxsdをコンパイルすることによって生成されます。私のアプリケーションでは、エンジニアリングのクラスインスタンスを構築することによって、学生情報の専門化属性を設定することを前提とします。私は を保存するときに、すべての操作の後に保存されますxmlファイルは、上記の内容は、非整列化のために行くとき

以下
<Student> 
    <Name>Name1</Name> 
    <Specialization> 
     <percentage>78<percentage> 
    </Specialization> 
</Student> 

のようなエントリは今、非整列化が予想外の要素を言って失敗しています。私はこれがb'cosだと推​​測します。Specialization要素は、格納されている派生オブジェクトではなく、それ自身でアンマーシャリングを呼び出すタイプの特殊化です。

私の説明は明らかです。派生クラスのインスタンス型に基づいてアンマーシャリングできる方法はありますか? xsdとbindings.xjbファイルは完全に私のコントロールの下にあるので、派生クラスのアンマーシャリングのためにアンマーシャルルールに伝えるすべてのエントリ/情報を追加または変更できます。


あなたの提案に感謝しますが、まだ私のために働いていません。タイプ
私のXSDを例に説明したものと同じに見えますが、それでもXSI:タイプが結果のXMLには来ないのxsi - ここ

は私が

オプション#1を試してみましたものです。コンパイル時に他の設定を追加する必要がありますか?これにはどのJaxBバージョンを使用しますか?

オプション#2 - 置換グループ
xsdに置換エントリの部分を追加すると、XSDのコンパイルで "Engineering"と "Medical"の重複した名前が表示されませんでした。私は、要素名と型名は同じコンパイルベビーベッドであると考えています(すべてのエンジニアリング、医療、特殊化は型定義と要素名で同じです)

モデル駆動型アーキテクチャを使用しているので、手元にあるのはxsdだけです。 xsdの変更は許可されています。理想的には最初のオプションが働いていたはずです。しかし、それがなぜ機能していないのか理解できません。問題を絞り込むための提案があれば教えてください。

答えて

1

JAXBを使用した場合、XMLでのJavaの継承を表現するさまざまな方法があります。

オプション#1 - XSI:属性を移入するために使用されているサブタイプを示すために使用されるこの表現でタイプ

は、この要素。

<Student> 
    <Name>Name1</Name> 
    <Specialization xsi:type="Engineering"> 
     <percentage>78<percentage> 
    </Specialization> 
</Student> 

詳細な例を参照されたい:

オプション#2 - 置換グループここでは要素名がサブタイプを示すために使用される

を。これは、置換グループのスキーマ概念に対応し、JAXBの@XmlElementRef注釈活用:

<Student> 
    <Name>Name1</Name> 
    <Engineering> 
     <percentage>78<percentage> 
    </Engineering> 
</Student> 

参照詳細な例を:

+0

ご提案をお寄せいただきありがとうございますが、それはまだ動作しません私のために。 これは私が試したものです オプション#1 - xsi:type 私のxsdは例で説明したものと同じように見えますが、Xsi:typeは結果のxmlに含まれていません。コンパイル時に他の設定を追加する必要がありますか?これにはどのJaxBバージョンを使用しますか? – user1110282

+0

オプション#2 - 置換グループ xsdで置換エントリの部分を追加したとき、XSDのコンパイルで "Engineering"と "Medical"の重複した名前が表示されませんでした。私は要素名と型が同じコンパイルベビーベッドであることを推測します(すべてのエンジニアリング、医療、専門は型定義と要素名の両方で同じです) モデル駆動型アーキテクチャを使用しているので、手元にあるのはxsdだけです。 xsdの変更は許可されています。理想的には最初のオプションが働いていたはずです。しかし、それがなぜ機能していないのか理解できません。あなたが持っている場合私に教えていくつかの提案 – user1110282

関連する問題