鉴于之前写的一篇博文没使用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. java异常练习2

    /*有一个圆形和长方形都可以获取面积,对于面积,如果出现非法数值,视为获取面积出现问题问题通过异常来表示.先要对这个程序进行基本的设置 *//*首先想一下,怎么写这个程序基本属性是肯定要的求面积呢?1 ...

  2. mac安装软件运行提示「xxx.app已损坏,打不开.你应该将它移到废纸篓」的解决办法

    「xxx.app已损坏,打不开.你应该将它移到废纸篓」,其实并非你安装的软件已损坏,而是Mac系统的安全设置问题,往往这些软件可能是经过了汉化或者破解,所以被Mac认为「已损坏」,那么解决方法就是临时 ...

  3. dorado抽取js

    dorado创建的视图文件如果有控件拥有事件的话,那么它是可以抽取js的, 右键视图->抽取JavaScript 然后就会出现一个同名的.js文件 (注意,所有的属性需要有id,因为js需要绑定 ...

  4. hdu 1250 Hat's Fibonacci(高精度数)

    //  继续大数,哎.. Problem Description A Fibonacci sequence is calculated by adding the previous two membe ...

  5. OpenJudge/Poj 1316 Self Numbers

    1.链接地址: http://poj.org/problem?id=1316 http://bailian.openjudge.cn/practice/1316 2.题目: 总时间限制: 1000ms ...

  6. C++中const修饰基本数据类型、指针、引用、对象

    const修饰基本数据类型 #include <iostream> using namespace std; void main(){ const int a = 1; const cha ...

  7. lucene 4.0学习

    一:官方文件 http://lucene.apache.org/core/4_0_0/ ps:网上参考文章:http://www.cnblogs.com/xing901022/p/3933675.ht ...

  8. WPF MVVM 中怎样在ViewModel总打开的对话框在窗体之前

    今天在WPF的项目中,写打印插件,在ViewModel中对需要弹出打印对话框,而对话框如果没有Owner所属的时候经常会被当前应用程序遮住,导致我都不知道到底弹出来没有! 参照:http://www. ...

  9. PHP生成压缩文件开发实例

    大概需求: 每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载 细节需求:当前订单号_年月日+时间.zip  例如: 1.生成压缩文件,压缩文件名格式: 2.压缩文件 ...

  10. 2014年度辛星css教程夏季版第三节

    第二节我们讲述的几乎全是CSS的选择器,那么下面这一节我们来讲一下CSS的颜色和文本的一些东西,虽然我对调色不大敏感,但是对于颜色还是比较感兴趣的. *********CSS中的颜色********* ...