2014-08-10 8 views
1

Я хочу поместить внутри Submenu два разных тега: Item и Separator, а затем проанализировать XML-документ с помощью XmlSerializer. Я могу сделать это, когда Submenu содержит только Item последовательность.Сериализация XML - коллекция нескольких типов

Образцовый XML документ:

<?xml version="1.0" encoding="utf-8" ?> 
<Navigation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="..."> 
    <Menu Name="Main"> 
    <Item Caption="File"> 
     <Submenu> 
     <Item Caption="New" Command="." /> 
     <Item Caption="Open" Command="." /> 
     <Separator /> 
     <Item Caption="Exit" Command="." /> 
     </Submenu> 
    </Item> 
    </Menu> 
</Navigation> 

И (не) работает C# код:

[Serializable] 
[XmlRoot("Navigation", IsNullable = false)] 
public class Navigation 
{ 
    [XmlElement("Menu")] 
    public List<Menu> MenuCollection { get; set; } 
} 

[Serializable] 
[XmlRoot("Menu", IsNullable = false)] 
public class Menu 
{ 
    [XmlAttribute("Name")] 
    public string Name { get; set; } 

    [XmlElement("Item")] 
    public List<Item> Items { get; set; } 
} 

[Serializable] 
[XmlRoot("Item", IsNullable = false)] 
public class Item 
{ 

    [XmlAttribute("Caption")] 
    public string Caption { get; set; } 

    [XmlAttribute("Command")] 
    public string Command { get; set; } 

    [XmlElement("Submenu", IsNullable = true)] 
    public Menu Submenu { get; set; } 
} 

Menu.Items должны содержит элементы и разделители. Как мне это сделать?

ответ

1

Хотя концептуально пункт меню и разделитель - две разные вещи, легче всего думать о них как о пунктах меню. Добавить новое свойство вашего Menu класса:

[XmlAttribute] 
    public bool IsSeparator { get; set; } 

Таким образом, Menu.Items нужно всегда содержать только Items. Ваш XML будет содержать такие элементы, как

<Item IsSeparator="true" /> 
Смежные вопросы