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

(0)

相关推荐

  • C# XML序列化方法及常用特性总结分析

    本文实例总结了C# XML序列化方法及常用特性.分享给大家供大家参考,具体如下: C#对象XML序列化(一):序列化方法和常用特性 .Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializer的使用比较直观,需要多注意的是XML序列化相关的Attribute,怎么把这些attribute应用到我们的对象,以及对象公共属性上面去,生成满足预期格式的XML. 这里列出了最

  • C#实现复杂XML的序列化与反序列化

    本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法.分享给大家供大家参考.具体方法如下: 已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象. Default.XML文件如下: <?xml version="1.0" encoding="utf-8" ?> <config> <rules> <rule name="namea"> <params&

  • C#序列化成XML注意细节

    最常用的序列化是把某个类序列化成二进制文件.但有时我们也会把类序列化成xml文件. 假如有如下一个类 复制代码 代码如下: class Arwen { private Hashtable table = new Hashtable(); private TimeSpan time = new TimeSpan(0, 0, 1); public Hashtable Table { get { return table; } set { table = value; } } public TimeS

  • c#正反序列化XML文件示例(xml序列化)

    复制代码 代码如下: using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;using System.Text.RegularExpressions;using System.Xml.Serialization;using System.IO;using System; namespace GlobalTimes.Framework{    /// <summar

  • C#实现Xml序列化与反序列化的方法

    本文实例讲述了C#实现Xml序列化与反序列化的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /// <summary> /// Xml序列化与反序列化 /// </summary> public class XmlUtil { public static string GetRoot(string xml) {     XmlDocument doc = new XmlDocument();     doc.LoadXml(xml.Replace("

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

  • C#实现xml文件反序列化读入数据到object的方法

    本文实例讲述了C#实现xml文件反序列化读入数据到object的方法.分享给大家供大家参考.具体实现方法如下: public static object DeSerializeFromXmlString(System.Type typeToDeserialize, string xmlString) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(xmlString); MemoryStream memoryStream = new Mem

  • C#实现对象XML序列化的方法

    本文实例讲述了C#实现对象XML序列化的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: using system; using system.xml; using system.xml.serialization; using system.text; using system.io; public class util {     /// <summary>     /// 对象序列化成 xml string     /// </summary>     p

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

    本文实例讲述了C#使用XML序列化操作菜单的方法.分享给大家供大家参考.具体分析如下: 之前的一篇文章<C#递归读取XML菜单数据的方法>没使用XML序列化来操作菜单,而且发现那还有一个问题,就是在XML菜单的某个菜单节点前加上一些注释代码的就不能读取,现在使用XML序列化后可以很方便的读取,故在此写一写. XML菜单的节点代码如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>   &l

  • C#实现基于XML配置MenuStrip菜单的方法

    本文实例讲述了C#实现基于XML配置MenuStrip菜单的方法.分享给大家供大家参考.具体如下: 1.关于本程序的说明 用XML配置MenuStrip菜单,本程序只是提供一个思路.程序在Load函数中根据XML文件中的设置动态生成一个MenuStrip组件的Items集合. 程序示例如下: 2.使用到的XML文档示例 <?xml version="1.0" encoding="gb2312"?> <!--MenuStrip:mnsMainMenu

  • python解析xml文件操作实例

    本文实例讲述了python解析xml文件操作的实现方法.分享给大家供大家参考.具体方法如下: xml文件内容如下: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first

  • C#操作读取、写入XML文档的实用方法

    本文给大家分享一下C#操作(读取.写入)XML文档的实用方法,这种方法主要是对比较规范的XML文档进行操作,因为它(XML文档)和类对象是严格对应的,否则在反序列或序列化的时候会出现错误.其他的不用多说,直接看示例代码吧: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using

  • C#对XmlHelper帮助类操作Xml文档的通用方法汇总

    前言 该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包括Xml序列化和反序列化,Xml文件读取,Xml文档节点内容增删改的一些通过方法).当然可能还有很多方法会漏了,假如各位同学好的方法可以在文末留言,我会统一收集起来. C#XML基础入门 https://www.jb51.net/article/104113.htm Xml反序列化为对象 #region Xml反序列化为对象 /// <summary>

  • DOM基础及php读取xml内容操作的方法

    本文实例讲述了DOM基础及php读取xml内容操作的方法.分享给大家供大家参考.具体分析如下: DOM(Document Object Model):文档对象模型.核心思想是:把 xml文件看作是一个对象模型,然后通过对象的方式来操作 xml 文件. php对xml文档进行增删改查(curd)操作,具体分析如下: xml文档:class.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <c

  • PHP XML操作的各种方法解析(比较详细)

    XML是一种流行的半结构化文件格式,以一种类似数据库的格式存储数据.在实际应用中,一些简单的.安全性较低的数据往往使用 XML文件的格式进行存储.这样做的好处一方面可以通过减少与数据库的交互性操作提高读取效率,另一方面可以有效利用 XML的优越性降低程序的编写难度. PHP提供了一整套的读取 XML文件的方法,很容易的就可以编写基于 XML的脚本程序.本章将要介绍 PHP与 XML的操作方法,并对几个常用的 XML类库做一些简要介绍. 1 XML简介 XML是"可扩展性标识语言(eXtensib

  • c#使用Dataset读取XML文件动态生成菜单的方法

    本文实例讲述了c#使用Dataset读取XML文件动态生成菜单的方法.分享给大家供大家参考.具体实现方法如下: Step 1:Form1 上添加一个ToolStripContainer控件 Step2:实现代码 private void Form2_Load(object sender, EventArgs e) { CMenuEx menu = new CMenuEx(); string sPath = "D://Menu.xml";//xml的内容 if (menu.FileExi

随机推荐