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

 
XML菜单的节点代码如下:
 
 
复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2   <ZCSoft.Net xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 3    <Applications>
 4       <Application ID ="OA" Text="OA管理系统">
 5         <Modules>
 6           <Module ID="OA_System" Text="系统管理">
 7             <Menus>
 8             <Menu ID="OA_System_UserManager" Text="人员管理" URL="System/UserManager/UserManagerList.aspx"> </Menu>
 9               <Menu ID="OA_System_RoleManager" Text="角色管理" URL="System/RoleManager/RoleManagerList.aspx"></Menu>
10               <Menu ID="OA_System_LoginLog" Text="登录日志" URL="System/Log/LoginLogList.aspx"></Menu>
11             <Menu ID="OA_System_OperateLog" Text="操作日志" URL="System/Log/OperateLogList.aspx"></Menu>
12             </Menus>
13           </Module>
14   
15           <Module ID="OA_TargetManage" Text="目标管理">
16             <Menus>
17               <Menu ID="OA_TargetManage_TargetSetup" Text="目标设定" URL="OA/TargetManage/TargetSetupList.aspx">
18               </Menu>
19             </Menus>
20           </Module>
21         </Modules>
22       </Application>
23     <Applications>
24 </ZCSoft.Net>
复制代码
 
 
这里面有一个节点:Applications(应用程序节点),里面可以放多个Application,而每个Application节点里面只包含一个Modules(模块节点),Modules有多个Module,每个Module又只有一个Menus(菜单节点),而Menus里有多个Menu。而每个节点都有两个公共的属性:ID和Text。
 
故这里写一个公共的属性类:BaseAttribute,前面记得加上序列化标识Serializable,代码如下:
 
复制代码
1 [Serializable]
2     public class BaseAttribute
3     {
4         [XmlAttribute(AttributeName = "ID")]
5         public string ID { get; set; }
7         [XmlAttribute(AttributeName = "Text")]
8         public string Text { get; set; }
9     }
复制代码
每个节点都有两个类,一个是列表,一个是实体,实体类需继承公共的类,如下:
 
 
复制代码
 1 [Serializable]
 2     public class ApplicationList
 3     {
 4         public ApplicationList()
 5         {
 6             this.Applications = new List<Application>();
 7         }
 8         [XmlElement(ElementName = "Application")]
 9         public List<Application> Applications { get; set; }
10     }
11 
12 [Serializable]
13     public class Application : BaseAttribute
14     {
15         public Application()
16         {
17             this.Modules = new ModuleList();
18         }
19         [XmlElement(ElementName = "Modules")]
20         public ModuleList Modules { get; set; }
21 
22         [XmlAttribute(AttributeName = "URL")]
23         public string URL { get; set; }
24     }
25 
26 
27 [Serializable]
28     public class ModuleList
29     {
30         public ModuleList()
31         {
32             this.modules = new List<Module>();
33         }
34         [XmlElement(ElementName = "Module")]
35         public List<Module> modules { get; set; }
36     }
37 
38 [Serializable]
39     public class Module : BaseAttribute
40     {
41         public Module()
42         {
43             this.Display = "True";
44             this.Menus = new MenuList();
45         }
46         [XmlElement(ElementName = "Menus")]
47         public MenuList Menus { get; set; }
48 
49         [XmlAttribute(AttributeName = "Display")]
50         public string Display { get; set; }
51 
52         [XmlAttribute(AttributeName = "URL")]
53         public string URL { get; set; }
54     }
55 
56 
57 [Serializable]
58     public class MenuList
59     {
60         public MenuList()
61         {
62             this.Menus = new List<Menu>();
63         }
64         [XmlElement(ElementName = "Menu")]
65         public List<Menu> Menus { get; set; }
66     }
67 
68 /// <summary>
69     /// 菜单类
70     /// </summary>
71     [Serializable]
72     public class Menu : BaseAttribute
73     {
74         public Menu()
75         {
76             this.Securityable = false;
77             this.Popup = false;
78         }
79 
80         [XmlAttribute(AttributeName = "Popup")]
81         public bool Popup { get; set; }
82 
83         [XmlAttribute(AttributeName = "Securityable")]
84         public bool Securityable { get; set; }
85 
86         [XmlAttribute(AttributeName = "URL")]
87         public string URL { get; set; }
88     }
复制代码
 
 
下面几个类是用于操作XML的,代码如下:
 
 
复制代码
 1 [Serializable,XmlRoot("ZCSoft.Net")]
 2     public class ZCSoftPlateForm
 3     {
 4         public ZCSoftPlateForm()
 5         {
 6             this.Applications = new ApplicationList();
 7         }
 8         [XmlElement(ElementName = "Applications")]
 9         public ApplicationList Applications { get; set; }
10     }
11 
12  /// <summary>
13     /// 操作XML类
14     /// </summary>
15     public class LoadFoundationXml
16     {
17         private static ZCSoftPlateForm _FoundationObject;
18         static LoadFoundationXml()
19         {
20             if (_FoundationObject == null)
21             {
22                 string path = AppDomain.CurrentDomain.BaseDirectory + "Foundation.xml";
23                 if (File.Exists(path))
24                 {
25                     _FoundationObject = Serialization.ToObject<ZCSoftPlateForm>(path);
26                 }
27             }
28         }
29         private LoadFoundationXml()
30         {
31         }
32 
33         public static ZCSoftPlateForm PlateFormObject
34         {
35             get 
36             {
37                 return _FoundationObject;
38             }
39         }
40     }
复制代码
 
 
最后就是一个序列化操作类,如下:
 
 
复制代码
 1 /// <summary>
 2     /// 序列化XML类
 3     /// </summary>
 4     public class Serialization
 5     {
 6         public static T ToObject<T>(string xmlFile)
 7         {
 8             FileStream stream = null;
 9             T local = Activator.CreateInstance<T>();
10             try
11             {
12                 XmlSerializer serializer = new XmlSerializer(typeof(T));
13                 stream = new FileStream(xmlFile, FileMode.Open, FileAccess.Read, FileShare.Read);
14                 local = (T)serializer.Deserialize(stream);
15                 stream.Close();
16             }
17             catch
18             {
19                 while (stream != null)
20                 {
21                     stream.Close();
22                     break;
23                 }
24                 throw new Exception("Xml deserialization failed!");
25             }
26             return local;
27         }
28     }
复制代码
在后台可以这样调用,这里没用递归,如下
 
 
复制代码
 1 private static ZCSoftPlateForm plateForm;
 2 
 3 List<MenuTreeData> list = new List<MenuTreeData>();
 4 
 5                         plateForm = LoadFoundationXml.PlateFormObject;
 6 
 7                         //使用操作XML类来读取XML
 8                         var appList = plateForm.Applications.Applications;
 9                         foreach (var application in appList)
10                         {
11                             var appData = new MenuTreeData();
12                             appData.ItemId = 0;
13                             appData.TemplateId = 0;
14                             appData.ItemCode = application.ID;
15                             appData.ItemName = application.Text;
16                             appData.ItemType = "Folder";
17                             appData.ItemOrder = 0;
18                             appData.Visible = true;
19                             appData.ItemUrl = null;
20                             appData.ParentItem = null;
21                             appData.ApplicationCode = application.ID;
22                             appData.ApplicationName = application.Text;
23                             appData.ModuleCode = null;
24                             appData.ModuleName = null;
25                             appData.Securityable = false;
26                             appData.Popup = false;
27                             list.Add(appData);
28 
29                             if (application.Modules!=null)
30                             {
31                                 foreach (var module in application.Modules.modules)
32                                 {
33                                     bool display = module.Display.ToLower() == "true" ? true : false;
34                                     string parentItem = null;//上一节点ID
35                                     var modData = new MenuTreeData();
36                                     modData.ItemId = 0;
37                                     modData.TemplateId = 0;
38                                     modData.ItemCode = module.ID;
39                                     modData.ItemName = module.Text;
40                                     modData.ItemType = "Folder";
41                                     modData.ItemOrder = 0;
42                                     modData.Visible = display;
43                                     modData.ItemUrl = null;
44                                     if (display)
45                                     {
46                                         parentItem = application.ID;
47                                     }
48 
49                                     modData.ParentItem = parentItem;
50                                     modData.ApplicationCode = application.ID;
51                                     modData.ApplicationName = application.Text;
52                                     modData.ModuleCode = module.ID;
53                                     modData.ModuleName = module.Text;
54                                     modData.Securityable = false;
55                                     modData.Popup = false;
56                                     list.Add(modData);
57 
58                                     if (module.Menus!=null)
59                                     {
60                                         foreach (var menu in module.Menus.Menus)
61                                         {
62                                             var mData = new MenuTreeData();
63                                             mData.ItemId = 0;
64                                             mData.TemplateId = 0;
65                                             mData.ItemCode = menu.ID;
66                                             mData.ItemName = menu.Text;
67                                             mData.ItemType = "Menu";
68                                             mData.ItemOrder = 0;
69                                             mData.Visible = true;
70                                             mData.ItemUrl = menu.URL;
71                                            
72                                             if (display)
73                                             {
74                                                 /*
75                                                 *  如果该菜单的所属模块中的Display属性设置为可见true
76                                                 * (注意:没有设置则默认为可见),则菜单的上级为Module的ID
77                                                 */
78                                                 mData.ParentItem = module.ID;
79                                             }
80                                             else 
81                                             {
82                                                 /*如果该菜单的所属模块中的Display属性设置为不可见false,
83                                                  * 则菜单的上级为Application的ID
84                                                  */
85                                                 mData.ParentItem = application.ID;
86                                             }
87                                             mData.ApplicationCode = application.ID;
88                                             mData.ApplicationName = application.Text;
89                                             mData.ModuleCode = module.ID;
90                                             mData.ModuleName = module.Text;
91                                             mData.Securityable = false;
92                                             mData.Popup = false;
93                                             list.Add(mData);
94                                         }
95                                     }
96                                 }
97                             }
98                         }
复制代码
使用到的菜单实体类:
 
 
复制代码
 1 /// <summary>
 2     /// 系统菜单
 3     /// </summary>
 4     public class MenuTreeData 
 5     {
 6         public int ItemId { get; set; }
 7 
 8         public int TemplateId { get; set; }
 9 
10         public string ItemCode { get; set; }
11 
12         public string ItemName { get; set; }
13 
14         public string ItemType { get; set; }
15 
16         public int ItemOrder { get; set; }
17 
18         public bool Visible { get; set; }
19 
20         public string ItemUrl { get; set; }
21 
22         public string ParentItem { get; set; }
23 
24         public string ApplicationCode { get; set; }
25 
26         public string ApplicationName { get; set; }
27 
28         public string ModuleCode { get; set; }
29 
30         public string ModuleName { get; set; }
31 
32         public bool Securityable { get; set; }
33 
34         public bool Popup { get; set; }
35     }

C# XML序列化操作菜单的更多相关文章

  1. C#对象XML序列化

    1.Xml序列化操作类 .Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象. 以下 ...

  2. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  3. 基于.net core封装的xml序列化,反序列化操作

    需求: 由于在.net core中去除了Xml序列化XmlSerializer操作类.因此,在于一此数据传输当中出,需要用到对xml格式字符串的处理问题.因此封装了一个xml序列化与反序列化操作的类库 ...

  4. C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...

  5. C#操作XML序列化与反序列化

    public class XmlSerializerHelper { /// <summary> /// 从XML文件中反序列化读取对象 /// </summary> /// ...

  6. [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类

    [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...

  7. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  8. Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET W ...

  9. c# XML序列化与反序列化

    c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...

随机推荐

  1. [leetcode] 407. Trapping Rain Water II

    https://leetcode.com/contest/6/problems/trapping-rain-water-ii/ 看到这题,我很高兴,因为我做过!哈哈!其实我现在也写不出来,知道大概思想 ...

  2. 重力加速度陀螺仪传感器MPU-6050(一)

    MPU-60X0 对陀螺仪和加速度计分别用了三个16 位的ADC,将其测量的模拟量转化 为可输出的数字量.为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±50 ...

  3. linux 客户端与linux服务器端连接与文件上传下载

    linux客户端连接linux服务器 用ssh 可以用 man ssh 查看用法 基本格式: ssh 用户名@主机名 如: ssh root@1.1.1.1 linux客户端上传文件到 linux 服 ...

  4. jquery中邮箱地址 URL网站地址正则验证实例代码

    QQ网站有一个网站举报的功能,看了一些js代码觉得写得很不错,我就拿下来了,下面是一个email验证与url网址验证js代码,分享给大家 email地址验证 复制代码代码如下: function ch ...

  5. PHP LINUX Notice: undefined $_GET完美解决方法

    PHP Notice: undefined 平时用$_GET[‘xx’] 取得参数值时,如果之前不加判断在未传进参数时会出现这样的警告: PHP Notice: undefined index xxx ...

  6. [PHP]MemCached高级缓存

    Memcache Win32 的安装下载:Memcache Win32 [www.php100.com]   [www.jehiah.cz/projects/memcached-win32/] 1.解 ...

  7. WPF 渐隐渐现切换背景图片

    最近学习WPF,尝试着自己做一些小玩意,也遇到了一些问题,于是整理记录以便日后查阅. 我们都知道WPF可以实现一些很炫的效果,然而有时候为达到这个目的却并不是一件很容易的事情.比如:在软件中我希望能够 ...

  8. SQL中子查询为聚合函数时的优化

    测试数据:create table test1 as select * from dba_objects where rownum<=10000;--10000条记录create table t ...

  9. Android openGL ES 2.0里Surfaceview背景透明

    surfaceview的黑色背景会挡住其父的背景,现在把surfaceview的背景设为透明,既可以看到所绘的3D物体,又可以看到背景. 在onSurfaceCreated里,调用GLES20.glC ...

  10. SVN服务器使用(二)

    上篇主要介绍的VisualSVN Server 安装,这篇主要介绍VisualSVN Server 的使用. 首先打开VisualSVN Server Manager,如图: 可以在窗口的右边看到版本 ...