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

本文关键字:集合 类型 序列化 XML 种类 | 更新日期: 2023-09-27 18:17:15

我想在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应包含项目和分隔符。我该怎么做呢?

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

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

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

这样,Menu.Items只需要包含Items。您的XML将以

这样的元素结束
    <Item IsSeparator="true" />