2012-04-17 17 views
2

XmlSerializerを使用してオブジェクトをシリアル化し、XSDで定義された順序を使用したいとします。私は、このためのスタブ・クラスを作成するためにXsd.exeではを使用しているオブジェクトをシリアライズし、xs:groupの順序を維持する

... 
<xs:element name="Screen" minOccurs="1" maxOccurs="1"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Yaxis" minOccurs="1" maxOccurs="1" type="ab:AxisType"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
... 

<xs:complexType name="AxisType"> 
    <xs:sequence> 
    <xs:group ref="ab:IntervalSegmentGroup" minOccurs="1" maxOccurs="unbounded"/> 
    <xs:element name="LastPoint" minOccurs="1" maxOccurs="1" type="ab:PointType" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:group name="IntervalSegmentGroup"> 
    <xs:sequence> 
    <xs:element name="Point" minOccurs="1" maxOccurs="1" type="ab:PointType"/> 
    <xs:element name="Interpolation" minOccurs="1" maxOccurs="1" type="xs:string"/> 
    </xs:sequence> 
</xs:group> 

<xs:complexType name="PointType"> 
    <xs:sequence> 
    <xs:element name="Relative" type="xs:decimal" minOccurs="1" maxOccurs="1"/> 
    <xs:element name="Absolute" type="xs:decimal" minOccurs="1" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 
... 

は、例えば、私はこのような要素を持つXSDを持っています。 次に、これらのクラスからオブジェクトを作成し、それらにデータを取り込みます。そして、私はXMLSerializerでそれらをシリアル化します。

私が取得したい結果はこのようなものです:

... 
<Yaxis> 
    <Point> 
    <Relative>0</Relative> 
    <Absolute>0</Absolute> 
    </Point> 
    <Interpolation>linear</Interpolation> 
    <Point> 
    <Relative>0.456</Relative> 
    <Absolute>100</Absolute> 
    </Point> 
    <Interpolation>linear</Interpolation> 
    <Point> 
    <Relative>0.645</Relative> 
    <Absolute>342</Absolute> 
    </Point> 
    <Interpolation>linear</Interpolation> 
    <LastPoint> 
    <Relative>1</Relative> 
    <Absolute>3920</Absolute> 
    </LastPoint> 
</Yaxis> 
... 

しかし、私は何を得ることである:

... 
<Yaxis> 
    <Point> 
    <Relative>0</Relative> 
    <Absolute>0</Absolute> 
    </Point> 
    <Point> 
    <Relative>0.456</Relative> 
    <Absolute>100</Absolute> 
    </Point> 
    <Point> 
    <Relative>0.645</Relative> 
    <Absolute>342</Absolute> 
    </Point> 
    <Interpolation>linear</Interpolation> 
    <Interpolation>linear</Interpolation> 
    <Interpolation>linear</Interpolation> 
    <LastPoint> 
    <Relative>1</Relative> 
    <Absolute>3920</Absolute> 
    </LastPoint> 
</Yaxis> 
... 

私はそれが失敗しますXSDに対してXMLを検証しようとして、ポイント、補間、ポイントを確認していません...

何が間違っていますか?これを何らかの方法で制御できますか?

+0

おそらく、 'XSD.exe'によって作成されたスタブクラスは、そのように命じられています。可能であれば、得られたスタブクラスを投稿して、質問に答えるのに役立てるかもしれません。 –

+0

には<補間>線形が関係していますか?あなたのスキーマにレベルを追加していないのですか?私のポイントは、あなたの実際のスキーマに何か問題があることを示す「順序」のことではなく、それをリファクタリングする必要がありますか? –

答えて

0

試行中クラスを生成するときに、XSD.exeのOrder引数を指定できます。

XSD.exe。

/order すべてのパーティクルメンバーに対して明示的なオーダー識別子を生成します。

これで問題を解決できる場合があります。

+0

素晴らしい!私はこれを試してみる – Marko

関連する問題