亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#使用XML序列化操作菜單的方法

2019-10-29 21:47:32
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C#使用XML序列化操作菜單的方法,是基于上一篇遞歸讀取XML菜單數據的改進方法,具有一定的參考借鑒價值,需要的朋友可以參考下
 

本文實例講述了C#使用XML序列化操作菜單的方法。分享給大家供大家參考。具體分析如下:

之前的一篇文章《C#遞歸讀取XML菜單數據的方法》沒使用XML序列化來操作菜單,而且發現那還有一個問題,就是在XML菜單的某個菜單節點前加上一些注釋代碼的就不能讀取,現在使用XML序列化后可以很方便的讀取,故在此寫一寫。

XML菜單的節點代碼如下:

 

復制代碼代碼如下:

<?xml version="1.0" encoding="utf-8"?>
  <ZCSoft.Net xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Applications>
      <Application ID ="OA" Text="OA管理系統">
        <Modules>
          <Module ID="OA_System" Text="系統管理">
            <Menus>
            <Menu ID="OA_System_UserManager" Text="人員管理" URL="System/UserManager/UserManagerList.aspx"> </Menu>
              <Menu ID="OA_System_RoleManager" Text="角色管理" URL="System/RoleManager/RoleManagerList.aspx"></Menu>
              <Menu ID="OA_System_LoginLog" Text="登錄日志" URL="System/Log/LoginLogList.aspx"></Menu>
            <Menu ID="OA_System_OperateLog" Text="操作日志" URL="System/Log/OperateLogList.aspx"></Menu>
            </Menus>
          </Module>
  
          <Module ID="OA_TargetManage" Text="目標管理">
            <Menus>
              <Menu ID="OA_TargetManage_TargetSetup" Text="目標設定" URL="OA/TargetManage/TargetSetupList.aspx">
              </Menu>
            </Menus>
          </Module>
        </Modules>
      </Application>
    <Applications>
</ZCSoft.Net>

 

這里面有一個節點:Applications(應用程序節點),里面可以放多個Application,而每個Application節點里面只包含一個Modules(模塊節點),Modules有多個Module,每個Module又只有一個Menus(菜單節點),而Menus里有多個Menu。而每個節點都有兩個公共的屬性:ID和Text。

故這里寫一個公共的屬性類:BaseAttribute,前面記得加上序列化標識Serializable,代碼如下:

 

復制代碼代碼如下:

[Serializable]
    public class BaseAttribute
    {
        [XmlAttribute(AttributeName = "ID")]
        public string ID { get; set; }

 

        [XmlAttribute(AttributeName = "Text")]
        public string Text { get; set; }
    }

 

每個節點都有兩個類,一個是列表,一個是實體,實體類需繼承公共的類,如下:

 

復制代碼代碼如下:

[Serializable]
    public class ApplicationList
    {
        public ApplicationList()
        {
            this.Applications = new List<Application>();
        }
        [XmlElement(ElementName = "Application")]
        public List<Application> Applications { get; set; }
    }

 

[Serializable]
    public class Application : BaseAttribute
    {
        public Application()
        {
            this.Modules = new ModuleList();
        }
        [XmlElement(ElementName = "Modules")]
        public ModuleList Modules { get; set; }

        [XmlAttribute(AttributeName = "URL")]
        public string URL { get; set; }
    }


[Serializable]
    public class ModuleList
    {
        public ModuleList()
        {
            this.modules = new List<Module>();
        }
        [XmlElement(ElementName = "Module")]
        public List<Module> modules { get; set; }
    }

[Serializable]
    public class Module : BaseAttribute
    {
        public Module()
        {
            this.Display = "True";
            this.Menus = new MenuList();
        }
        [XmlElement(ElementName = "Menus")]
        public MenuList Menus { get; set; }

        [XmlAttribute(AttributeName = "Display")]
        public string Display { get; set; }

        [XmlAttribute(AttributeName = "URL")]
        public string URL { get; set; }
    }


[Serializable]
    public class MenuList
    {
        public MenuList()
        {
            this.Menus = new List<Menu>();
        }
        [XmlElement(ElementName = "Menu")]
        public List<Menu> Menus { get; set; }
    }

/// <summary>
    /// 菜單類
    /// </summary>
    [Serializable]
    public class Menu : BaseAttribute
    {
        public Menu()
        {
            this.Securityable = false;
            this.Popup = false;
        }

        [XmlAttribute(AttributeName = "Popup")]
        public bool Popup { get; set; }

        [XmlAttribute(AttributeName = "Securityable")]
        public bool Securityable { get; set; }

        [XmlAttribute(AttributeName = "URL")]
        public string URL { get; set; }
    }

 

下面幾個類是用于操作XML的,代碼如下:

 

復制代碼代碼如下:

[Serializable,XmlRoot("ZCSoft.Net")]
    public class ZCSoftPlateForm
    {
        public ZCSoftPlateForm()
        {
            this.Applications = new ApplicationList();
        }
        [XmlElement(ElementName = "Applications")]
        public ApplicationList Applications { get; set; }
    }

 

 /// <summary>
    /// 操作XML類
    /// </summary>
    public class LoadFoundationXml
    {
        private static ZCSoftPlateForm _FoundationObject;
        static LoadFoundationXml()
        {
            if (_FoundationObject == null)
            {
                string path = AppDomain.CurrentDomain.BaseDirectory + "Foundation.xml";
                if (File.Exists(path))
                {
                    _FoundationObject = Serialization.ToObject<ZCSoftPlateForm>(path);
                }
            }
        }
        private LoadFoundationXml()
        {
        }

        public static ZCSoftPlateForm PlateFormObject
        {
            get 
            {
                return _FoundationObject;
            }
        }
    }

 

最后就是一個序列化操作類,如下:

 

復制代碼代碼如下:

/// <summary>
    /// 序列化XML類
    /// </summary>
    public class Serialization
    {
        public static T ToObject<T>(string xmlFile)
        {
            FileStream stream = null;
            T local = Activator.CreateInstance<T>();
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                stream = new FileStream(xmlFile, FileMode.Open, FileAccess.Read, FileShare.Read);
                local = (T)serializer.Deserialize(stream);
                stream.Close();
            }
            catch
            {
                while (stream != null)
                {
                    stream.Close();
                    break;
                }
                throw new Exception("Xml deserialization failed!");
            }
            return local;
        }
    }

 

在后臺可以這樣調用,這里沒用遞歸,如下

 

復制代碼代碼如下:

private static ZCSoftPlateForm plateForm;

 

List<MenuTreeData> list = new List<MenuTreeData>();

plateForm = LoadFoundationXml.PlateFormObject;

//使用操作XML類來讀取XML
var appList = plateForm.Applications.Applications;
foreach (var application in appList)
{
    var appData = new MenuTreeData();
    appData.ItemId = 0;
    appData.TemplateId = 0;
    appData.ItemCode = application.ID;
    appData.ItemName = application.Text;
    appData.ItemType = "Folder";
    appData.ItemOrder = 0;
    appData.Visible = true;
    appData.ItemUrl = null;
    appData.ParentItem = null;
    appData.ApplicationCode = application.ID;
    appData.ApplicationName = application.Text;
    appData.ModuleCode = null;
    appData.ModuleName = null;
    appData.Securityable = false;
    appData.Popup = false;
    list.Add(appData);

    if (application.Modules!=null)
    {
 foreach (var module in application.Modules.modules)
 {
     bool display = module.Display.ToLower() == "true" ? true : false;
     string parentItem = null;//上一節點ID
     var modData = new MenuTreeData();
     modData.ItemId = 0;
     modData.TemplateId = 0;
     modData.ItemCode = module.ID;
     modData.ItemName = module.Text;
     modData.ItemType = "Folder";
     modData.ItemOrder = 0;
     modData.Visible = display;
     modData.ItemUrl = null;
     if (display)
     {
  parentItem = application.ID;
     }

     modData.ParentItem = parentItem;
     modData.ApplicationCode = application.ID;
     modData.ApplicationName = application.Text;
     modData.ModuleCode = module.ID;
     modData.ModuleName = module.Text;
     modData.Securityable = false;
     modData.Popup = false;
     list.Add(modData);

     if (module.Menus!=null)
     {
  foreach (var menu in module.Menus.Menus)
  {
      var mData = new MenuTreeData();
      mData.ItemId = 0;
      mData.TemplateId = 0;
      mData.ItemCode = menu.ID;
      mData.ItemName = menu.Text;
      mData.ItemType = "Menu";
      mData.ItemOrder = 0;
      mData.Visible = true;
      mData.ItemUrl = menu.URL;
     
      if (display)
      {
   /*
   *  如果該菜單的所屬模塊中的Display屬性設置為可見true
   * (注意:沒有設置則默認為可見),則菜單的上級為Module的ID
   */
   mData.ParentItem = module.ID;
      }
      else 
      {
   /*如果該菜單的所屬模塊中的Display屬性設置為不可見false,
    * 則菜單的上級為Application的ID
    */
   mData.ParentItem = application.ID;
      }
      mData.ApplicationCode = application.ID;
      mData.ApplicationName = application.Text;
      mData.ModuleCode = module.ID;
      mData.ModuleName = module.Text;
      mData.Securityable = false;
      mData.Popup = false;
      list.Add(mData);
  }
     }
 }
    }
}

 

使用到的菜單實體類:

 

復制代碼代碼如下:

/// <summary>
/// 系統菜單
/// </summary>
public class MenuTreeData 
{
        public int ItemId { get; set; }

 

        public int TemplateId { get; set; }

        public string ItemCode { get; set; }

        public string ItemName { get; set; }

        public string ItemType { get; set; }

        public int ItemOrder { get; set; }

        public bool Visible { get; set; }

        public string ItemUrl { get; set; }

        public string ParentItem { get; set; }

        public string ApplicationCode { get; set; }

        public string ApplicationName { get; set; }

        public string ModuleCode { get; set; }

        public string ModuleName { get; set; }

        public bool Securityable { get; set; }

        public bool Popup { get; set; }
}

 

希望本文所述對大家的C#程序設計有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国内精品久久影院| 国产亚洲欧洲黄色| 91亚洲一区精品| 亚洲97在线观看| 日韩在线视频一区| 亚洲精品久久久久久久久久久| 中文字幕在线国产精品| 久久久亚洲欧洲日产国码aⅴ| 国产成人在线视频| 91精品久久久久久| 亚洲欧洲国产一区| 青青草国产精品一区二区| 国产精品人成电影在线观看| 亚洲最新在线视频| 俺去亚洲欧洲欧美日韩| 91欧美精品午夜性色福利在线| 亚洲欧洲视频在线| 亚洲最大的成人网| 亚洲免费精彩视频| 红桃视频成人在线观看| 久久国产精品久久精品| 欧美日韩国产在线播放| 亚洲网站在线播放| 九九热最新视频//这里只有精品| 色综合久久悠悠| 色综合久久中文字幕综合网小说| 激情成人中文字幕| 欧美激情精品久久久久久大尺度| 久久人人爽人人爽人人片av高请| 亚洲国产成人爱av在线播放| 777国产偷窥盗摄精品视频| 国产91在线播放| 久久久91精品国产| 国产精品夫妻激情| 久久精品国产电影| 亚洲精品中文字幕有码专区| 91亚洲国产成人久久精品网站| 91精品久久久久久久久久入口| 国产亚洲美女久久| 欧美性猛交丰臀xxxxx网站| 欧美成aaa人片在线观看蜜臀| 国产97色在线| 高清在线视频日韩欧美| 国产玖玖精品视频| 欧美国产激情18| 欧美成aaa人片在线观看蜜臀| 欧美猛交ⅹxxx乱大交视频| 国产精品99久久久久久www| 欧美国产视频日韩| 国产精品私拍pans大尺度在线| 久久精品国产2020观看福利| 欧美激情性做爰免费视频| 奇米成人av国产一区二区三区| 久久99久久99精品免观看粉嫩| 亚洲天堂av图片| 国产精品xxxxx| 国产国语videosex另类| 成人在线国产精品| 欧美成人午夜激情视频| 海角国产乱辈乱精品视频| 欧亚精品在线观看| 国产精品黄色影片导航在线观看| 国产成人中文字幕| 欧美成人高清视频| 91精品国产九九九久久久亚洲| 国产网站欧美日韩免费精品在线观看| 欧美肥老太性生活视频| 中文字幕一区二区精品| 国产精品狼人色视频一区| 福利精品视频在线| 欧美日韩在线看| 亚洲精品www久久久久久广东| 原创国产精品91| 欧美日韩日本国产| 久久久久久久久久久人体| 揄拍成人国产精品视频| 88xx成人精品| 国产精品吹潮在线观看| 日本久久久a级免费| 神马久久桃色视频| 91亚洲午夜在线| 成人精品在线视频| 中文字幕亚洲天堂| 欧美日韩国产成人在线观看| 最近2019年手机中文字幕| 国产精品中文久久久久久久| 亚洲成人久久久久| 精品美女永久免费视频| 日韩av片免费在线观看| 人妖精品videosex性欧美| 欧美大片在线免费观看| 亚洲福利视频网| 亚洲国产成人精品女人久久久| 亚洲色图国产精品| 精品国产网站地址| 欧美激情第一页xxx| 神马久久桃色视频| 亚洲xxxx3d| 岛国精品视频在线播放| 日韩av在线精品| 亚洲精品色婷婷福利天堂| 亚洲国产第一页| 国产精品男人爽免费视频1| 国产成人精品久久久| 91免费欧美精品| 久久精品中文字幕电影| 色综合91久久精品中文字幕| 国产99久久精品一区二区永久免费| 久久久成人精品视频| 欧美亚洲国产日本| 亚洲乱亚洲乱妇无码| 欧美尺度大的性做爰视频| 色琪琪综合男人的天堂aⅴ视频| 岛国视频午夜一区免费在线观看| 亚洲免费视频一区二区| 色婷婷av一区二区三区久久| 欧美二区在线播放| 精品久久久久久中文字幕一区奶水| 欧美日韩在线一区| 日韩精品丝袜在线| 亚洲乱码一区二区| 国产精品27p| 亚洲国产欧美一区二区三区久久| 国产精品99久久久久久白浆小说| 91超碰caoporn97人人| 欧美亚洲国产另类| 精品亚洲va在线va天堂资源站| 久久91超碰青草是什么| 国产成人鲁鲁免费视频a| 亚洲www永久成人夜色| 国模私拍视频一区| 97在线观看视频国产| 日本精品一区二区三区在线播放视频| 欧美国产日韩中文字幕在线| 国产精品久久久久久av福利软件| 欧美激情奇米色| 久久亚洲精品视频| 亚洲色图五月天| 日本高清视频精品| 国产一区红桃视频| www.美女亚洲精品| www.亚洲天堂| 亚洲成人网在线观看| 成人日韩av在线| 国产精品美乳一区二区免费| 亚洲欧美国产日韩中文字幕| 国产乱肥老妇国产一区二| 国产精品老牛影院在线观看| 亚洲电影在线看| 97成人超碰免| 欧美成人精品xxx| 精品国偷自产在线视频99| 91九色精品视频| 日韩免费视频在线观看| 国产精品视频午夜| 久久91亚洲精品中文字幕奶水| 中文字幕一精品亚洲无线一区| 国产精品男女猛烈高潮激情| 欧美成人中文字幕在线| 国产成人精品一区二区三区| 国产成人亚洲综合91精品| 亚洲国产又黄又爽女人高潮的| 秋霞av国产精品一区| 91国内揄拍国内精品对白|