时间:2021-05-20
本文实例讲述了C#使用XML序列化操作菜单的方法。分享给大家供大家参考。具体分析如下:
之前的一篇文章《C#递归读取XML菜单数据的方法》没使用XML序列化来操作菜单,而且发现那还有一个问题,就是在XML菜单的某个菜单节点前加上一些注释代码的就不能读取,现在使用XML序列化后可以很方便的读取,故在此写一写。
XML菜单的节点代码如下:
复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<ZCSoft.Net xmlns:xsi="http://")]
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#程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#实现Xml序列化与反序列化的方法。分享给大家供大家参考。具体实现方法如下:复制代码代码如下://////Xml序列化与反序列化///publi
本文实例总结了C#XML序列化方法及常用特性。分享给大家供大家参考,具体如下:C#对象XML序列化(一):序列化方法和常用特性.NetFramework提供了对
本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法。分享给大家供大家参考。具体方法如下:已知.xml(再此命名default.xml)文件,请
本文实例讲述了C#中datatable序列化与反序列化,分享给大家供大家参考。具体方法如下:一、datatable序列化publicstringgetSendD
本文实例讲述了C#实现xml文件反序列化读入数据到object的方法。分享给大家供大家参考。具体实现方法如下:publicstaticobjectDeSeria