简体   繁体   English

在同一节点中使用 XmlSerializer 订购不同的自定义类

[英]Order different custom classes with XmlSerializer in same node

I have the following XML structure:我有以下 XML 结构:

<TabHierarchy>
    <Tab Name="Tab1"/>
    <TabGroup Name="Group1">                
        <Tab Name="Tab2"/>
        <Tab Name="Tab3"/>
        <Tab Name="Tab4"/>
    </TabGroup>
    <Tab Name="Tab5"/>
    <TabGroup Name="Group2">
        <Tab Name="Tab6"/>
        <TabGroup Name="Group3">
            <Tab Name="Tab7"/>
            <Tab Name="Tab8"/>
        </TabGroup>
        <Tab Name="Tab9"/>
    </TabGroup>
    <Tab Name="Tab10"/>
</TabHierarchy>

My C# classes:我的 C# 类:

public class XmlTabHierarchy
{
    public XmlTabHierarchy()
    {
        Tab = new List<XmlTab>();
        TabGroup = new List<XmlTabGroup>();
        TabReport = new List<XmlReportTab>();
    }
    [XmlElement("Tab")] public List<XmlTab> Tab { get; set; }
    [XmlElement("TabGroup")] public List<XmlTabGroup> TabGroup { get; set; }
    [XmlElement("ReportTabs")] public List<XmlReportTab> TabReport { get; set; }
}
public class XmlTab
{
    [XmlIgnore] public int Order { get; set; }
    [XmlIgnore] public string Group { get; set; }
    [XmlIgnore] public bool Use { get; set; }
    [XmlIgnore] public bool ByUser { get; set; }
    [XmlIgnore] public bool KeyTab { get; set; }
    [XmlIgnore] public string Tab { get; set; }
    [XmlAttribute("Name")] public string TabClean { get; set; }
    [XmlAttribute("Alias")] public string Alias { get; set; }
    [XmlIgnore] public string Type { get; set; }
    [XmlIgnore] public bool Duplicate { get; set; }
}
public class XmlTabGroup
{
    public XmlTabGroup()
    {
        Tab = new List<XmlTab>();
        TabGroup = new List<XmlTabGroup>();
    }
    [XmlIgnore] public int Order { get; set; }
    [XmlIgnore] public int GroupId { get; set; }
    [XmlAttribute("Name")] public string Group { get; set; }
    [XmlAttribute("Alias")] public string Alias { get; set; }
    [XmlElement("Tab")] public List<XmlTab> Tab { get; set; }
    [XmlElement("TabGroup")] public List<XmlTabGroup> TabGroup { get; set; }
}

The issue I am having is, being able to sort them correctly.我遇到的问题是,能够正确地对它们进行排序。 As seen in the example XML, Tabs can be between TabGroups.如示例 XML 中所示,选项卡可以位于选项卡组之间。 The ReportTabs are always at the end. ReportTabs 总是在最后。 There is one post here with a similar problem but I don't know how to implement it for my project.这里有一篇帖子有类似的问题,但我不知道如何为我的项目实施它。 Keep sort when deserialize and serialize XML using XmlSerializer 使用 XmlSerializer 反序列化和序列化 XML 时保持排序

XML specification the order of elements are not required. XML 规范元素的顺序不是必需的。 The code below creates the XML according to the XML specification.下面的代码根据 XML 规范创建 XML。

using System;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApp2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {

            XmlTabHierarchy hierarchy = new XmlTabHierarchy()
            {
                Tab = new List<XmlTab>()
                {
                    new XmlTab() { TabClean = "Tab1"},
                    new XmlTab() { TabClean = "Tab5"},
                    new XmlTab() { TabClean = "Tab10"}
                },
                TabGroup = new List<XmlTabGroup>()
                {
                    new XmlTabGroup()
                    {
                        Group = "Group1",
                        Tab = new List<XmlTab>()
                        {
                            new XmlTab() { TabClean = "Tab2"},
                            new XmlTab() { TabClean = "Tab3"},
                            new XmlTab() { TabClean = "Tab4"}
                        }
                    },
                    new XmlTabGroup()
                    {
                        Group = "Group2",
                        Tab = new List<XmlTab>()
                        {
                            new XmlTab() { TabClean = "6" },
                            new XmlTab() { TabClean = "9"},
                        },
                        TabGroup = new List<XmlTabGroup>()
                        {
                            new XmlTabGroup()
                            {
                                Group = "Group3",
                                Tab = new List<XmlTab>()
                                {
                                    new XmlTab() { TabClean = "Tab7"},
                                    new XmlTab() { TabClean = "Tab8"}
                                }
                            }
                        }
                    }
                }
                
            };

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(FILENAME, settings);
            XmlSerializer serializer = new XmlSerializer(typeof(XmlTabHierarchy));
            serializer.Serialize(writer, hierarchy);
            
        }

    }
    public class XmlTabHierarchy
    {
        public XmlTabHierarchy()
        {
            Tab = new List<XmlTab>();
            TabGroup = new List<XmlTabGroup>();
        }
        [XmlElement("Tab")] 
        public List<XmlTab> Tab { get; set; }
        [XmlElement("TabGroup")] 
        public List<XmlTabGroup> TabGroup { get; set; }
    }
    public class XmlTab
    {
        [XmlAttribute("Name")] 
        public string TabClean { get; set; }
        [XmlAttribute("Alias")] 
        public string Alias { get; set; }
    }
    public class XmlTabGroup
    {
        public XmlTabGroup()
        {
            Tab = new List<XmlTab>();
            TabGroup = new List<XmlTabGroup>();
        }
        [XmlAttribute("Name")] 
        public string Group { get; set; }
        [XmlAttribute("Alias")] 
        public string Alias { get; set; }
        [XmlElement("Tab")] 
        public List<XmlTab> Tab { get; set; }
        [XmlElement("TabGroup")] 
        public List<XmlTabGroup> TabGroup { get; set; }
    }


}
 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM