簡體   English   中英

在同一節點中使用 XmlSerializer 訂購不同的自定義類

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

我有以下 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>

我的 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; }
}

我遇到的問題是,能夠正確地對它們進行排序。 如示例 XML 中所示,選項卡可以位於選項卡組之間。 ReportTabs 總是在最后。 這里有一篇帖子有類似的問題,但我不知道如何為我的項目實施它。 使用 XmlSerializer 反序列化和序列化 XML 時保持排序

XML 規范元素的順序不是必需的。 下面的代碼根據 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