栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

本文实例讲述了C#使用XML序列化操作菜单的方法。分享给大家供大家参考。具体分析如下:

之前的一篇文章《C#递归读取XML菜单数据的方法》没使用XML序列化来操作菜单,而且发现那还有一个问题,就是在XML菜单的某个菜单节点前加上一些注释代码的就不能读取,现在使用XML序列化后可以很方便的读取,故在此写一写。

XML菜单的节点代码如下:

复制代码 代码如下:

 
  
     
       
         
           
            


             
             
            
           
         
 
         
           
             
             

           

         

       
     
    

这里面有一个节点: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();
        }
        [XmlElement(ElementName = "Application")]
        public List 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();
        }
        [XmlElement(ElementName = "Module")]
        public List 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

();
        }
        [XmlElement(ElementName = "Menu")]
        public List Menus { get; set; }
    }

///


    /// 菜单类
    ///

    [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; }
    }

 ///


    /// 操作XML类
    ///

    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(path);
                }
            }
        }
        private LoadFoundationXml()
        {
        }

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

最后就是一个序列化操作类,如下:

复制代码 代码如下:
///


    /// 序列化XML类
    ///

    public class Serialization
    {
        public static T ToObject(string xmlFile)
        {
            FileStream stream = null;
            T local = Activator.CreateInstance();
            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 list = new List();

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)
      {
   
   mData.ParentItem = module.ID;
      }
      else
      {
   
   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);
  }
     }
 }
    }
}

使用到的菜单实体类:

复制代码 代码如下:
///


/// 系统菜单
///

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#程序设计有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/125815.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号