2011-07-15 55 views
1

我是c#的全新品牌(第2天),所以如果我的術語有點偏離,我會提前道歉。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文檔被反序列化時,內容爲空。我也注意到,如果我結構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> 

不過,我需要能夠deseralize XML結構如圖所示的第一個例子。

實現這個目標的最佳方式是什麼?

謝謝你的時間!

編輯

更新XML結構使問題更加清晰。

+0

你沒有提到的一件事是有多少Group和Text節點可以是頁面的子節點。你的例子意味着它們只能出現一次。 – Jay

+0

是的好點。我更新了原始帖子以包含每種類型的多個元素。 – drkstr

回答

3

使用XmlElement,如果你不想要一個包裝元素:

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

其他注意事項:

  • 你並不需要一般不推薦[Serializable]
  • 公共領域 - 財產將是首選
  • 海事組織的名單將b e比這裏的數組好
+0

真棒,那就是訣竅!並感謝您的額外筆記。公共領域只是爲了簡潔起見,但我一定會做出您提到的其他更改。謝謝您的幫助! – drkstr

+0

是否可以保持元素的原始順序? –

0

鑑於您可能在頁面下具有相同類型的multipule節點,這應該起作用。

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

對不起,我不是那麼清楚。它需要被推入一個單一的列表以符合外部API。我想如果這是唯一的選擇,我可以爲每種類型的元素創建getters/setter,並手動填充內容列表。有很多不同的元素類型,所以這不會是一個理想的解決方案... – drkstr

+0

查看我的更新。 – Jay

+0

我認爲這就是你的意思開始。同樣的問題也適用。我需要一個包含所有子元素的列表。有沒有辦法使用序列化來做到這一點? – drkstr