XML序列化 - 多种类型的集合

时间:2014-08-10 12:28:30

标签: c# .net xmlserializer

我想在Submenu内放两个不同的标记:ItemSeparator,然后使用XmlSerializer解析XML文档。当Submenu仅包含Item序列时,我可以这样做。

示例性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 个答案:

答案 0 :(得分:1)

虽然概念上菜单项和分隔符是两个不同的东西,但最容易将它们视为菜单项。将新属性添加到Menu类:

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

这样,Menu.Items只需要包含Items。您的XML最终将使用

等元素
    <Item IsSeparator="true" />