C#使用XML序列化操作菜单的方法
作者:shichen2014 发布时间:2022-08-03 08:54:34
本文实例讲述了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#程序设计有所帮助。


猜你喜欢
- 本文实例讲述了C#实现图像锐化的方法。分享给大家供大家参考。具体如下://定义图像锐化函数private static Bitmap Sha
- 1.图集导航1.1 为什么对包名的命名要有所规范呢!使用规范的命名有益于程序的开发和后期阅读通俗的说:就是自己写的代码别人也能看的懂,代码结
- 平面区域填充算法是计算机图形学领域的一个很重要的算法,区域填充即给出一个区域的边界(也可以是没有边界,只是给出指定颜色),要求将边界范围内的
- 本文实例讲述了Java接口继承和使用接口操作。分享给大家供大家参考,具体如下:一 接口的继承1 点睛接口支持多继承,一个接口可以有多个父接口
- Java解压缩zip - 多个文件(包括文件夹),对多个文件和文件夹进行压缩,对复杂的文件目录进行解压。压缩方法使用的是可变参数,可以压缩1
- 在Java 字符终端上获取输入有三种方式:1、java.lang.System.in (目前JDK版本均支持)2、java.util.Sca
- 插入排序插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入
- java中的前加加++和后加加++,有很多人搞的很晕,不太明白!今天我举几个例子说明下前++和后++的区别!其实大家只要记住一句话就可以了,
- 前言学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说:你写一个定时任务就好了。写个定时任务让他去爬取就行了。我不会,所以现在得补回
- 目录Retrofit介绍Retrofit优点Retrofit的使用1.引入依赖项2.添加网络权限3.编写Retrofit辅助类4.定义Api
- 背景何为延迟队列?顾名思义,延迟队列就是进入该队列的消息会被延迟消费的队列。而一般的队列,消息一旦入队了之后就会被消费者马上消费。场景一:在
- 问题描述:eclipse启动tomcat时,不能加载web项目,但是把war包丢进tomcat的webapps下是能正常运行的解决方式:右键
- 当多个界面都有很多相似部分时,可以考虑创建一个功能较全的模板。而在需要时,可以通过引用模板来实现自己想要实现的功能。比如适配器 Adapte
- 1.什么是servlet?sun(oracle)公司制订的一种用来扩展web服务器端功能的组件规范。背景:常用的web服务器:apache
- 做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQL
- 一、java内存区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和
- 一.简单介绍1.配置相关的依赖2.配置模式3写.mapper、controller、service4.配置yaml文件 配置mybatis全
- 问题来源一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持
- 目录1 任务状态手动控制任务启动确保任务已激活2 任务取消3 进度报告4 Task.Yield 让步5 定制异步任务后续操作Configur
- 最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录。一、发送消息没有调用公