2011-07-15 12 views
1

私は新しい(2日目)をC#にするので、私の用語がちょっとしたものであれば事前にお詫びします。XMLシリアル化 - 特定のタイプの子要素のリストを作成する

次のXMLとクラスのモデルを考えてみましょう:

<Page label="Page 1.1"> 
    <Group label="Group 1.1.1"></Group> 
    <Group label="Group 1.1.2"></Group> 
    <Text label="Text 1.1.1"></Text> 
    <Text label="Text 1.1.2"></Text> 
</Page> 

public class AbstractElementModel 
{ 
    [XmlAttributeAttribute()] 
    public string label; 
} 

[Serializable] 
public class Page:AbstractElementModel 
{ 
    [XmlArrayItem(typeof(Group)), 
    XmlArrayItem(typeof(Text))] 
    public AbstractElementModel[] content; 
} 

(グループとテキストのモデルが示されていない、この例のために、彼らはAbstractElementModelを拡張空白クラスである)

私のことができるようにしたいと思いますグループまたはテキストのインスタンスをコンテンツリストにプッシュします。ただし、XML文書がデシリアライズされると、コンテンツはnullになります。私は次のように私はXMLを構造化する場合、それが動作することを通知しました:

<Page label="Page 1.1"> 
    <content> 
     <Group label="Group 1.1.1"></Group> 
     <Group label="Group 1.1.2"></Group> 
     <Text label="Text 1.1.1"></Text> 
     <Text label="Text 1.1.2"></Text> 
    </content> 
</Page> 

はしかし、私は最初の例に示すように、XMLの構造をdeseralizeできるようにする必要があります。

これを実現する最善の方法は何ですか?

ありがとうございました!問題をより明確にするためにXML構造を更新しました

編集

+0

あなたが言及していないことの1つは、いくつのグループノードとテキストノードがページの子になれるかです。あなたの例は、それらが一度だけ起こることを意味します。 – Jay

+0

はい良い点。元の投稿を更新して、各タイプの複数の要素を含むようにしました。 – drkstr

答えて

3

使用XmlElementあなたはラッパー要素を必要としない場合:

public class Page:AbstractElementModel 
{ 
    [XmlElement("Group", typeof(Group))] 
    [XmlElement("Text", typeof(Text))] 
    public AbstractElementModel[] content; 
} 

その他の注意事項:

  • あなたは[Serializable]
  • publicフィールドを必要としないが、一般的に推奨されていません - プロパティが好ましいでしょう
  • IMOリストはbですここの配列よりも優れています
+0

素晴らしい、トリックでした!追加のメモをありがとう。パブリックフィールドはこの例では簡潔に表示されていましたが、あなたが言及した他の変更を確実に行います。助けてくれてありがとう! – drkstr

+0

要素の元の順序を保持することは可能ですか? –

0

ページの下に同じタイプのマルチノードノードがあるとすれば、これはうまくいくはずです。

[Serializable] 
public class Page:AbstractElementModel 
{ 
    [XmlArrayItem()] 
    public Group[] Group; 
    [XmlArrayItem()] 
    public Text[] Text; 
} 
+0

申し訳ありませんが、私はそれについてはっきりしていませんでした。外部APIに準拠するには、単一のリストにプッシュする必要があります。私はそれが唯一の選択肢だったとすれば、すべてのタイプの要素に対してgetter/setterを作成して、手動でコンテンツリストを作成することができました。さまざまな種類の要素があるので、これは理想的な解決策ではありません。 – drkstr

+0

更新を見ます。 – Jay

+0

私はそれがあなたが始めることを意図したものだと考えました。同じ問題が適用されます。すべての子要素を含む単一のリストが必要です。シリアル化を使用してこれを行う方法はありませんか? – drkstr

関連する問題