C#使用XML序列化操作菜單的方法
本文實(shí)例講述了C#使用XML序列化操作菜單的方法。分享給大家供大家參考。具體分析如下:
之前的一篇文章《C#遞歸讀取XML菜單數(shù)據(jù)的方法》沒(méi)使用XML序列化來(lái)操作菜單,而且發(fā)現(xiàn)那還有一個(gè)問(wèn)題,就是在XML菜單的某個(gè)菜單節(jié)點(diǎn)前加上一些注釋代碼的就不能讀取,現(xiàn)在使用XML序列化后可以很方便的讀取,故在此寫一寫。
XML菜單的節(jié)點(diǎn)代碼如下:
<?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管理系統(tǒng)">
<Modules>
<Module ID="OA_System" Text="系統(tǒng)管理">
<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="目標(biāo)管理">
<Menus>
<Menu ID="OA_TargetManage_TargetSetup" Text="目標(biāo)設(shè)定" URL="OA/TargetManage/TargetSetupList.aspx">
</Menu>
</Menus>
</Module>
</Modules>
</Application>
<Applications>
</ZCSoft.Net>
這里面有一個(gè)節(jié)點(diǎn):Applications(應(yīng)用程序節(jié)點(diǎn)),里面可以放多個(gè)Application,而每個(gè)Application節(jié)點(diǎn)里面只包含一個(gè)Modules(模塊節(jié)點(diǎn)),Modules有多個(gè)Module,每個(gè)Module又只有一個(gè)Menus(菜單節(jié)點(diǎn)),而Menus里有多個(gè)Menu。而每個(gè)節(jié)點(diǎn)都有兩個(gè)公共的屬性:ID和Text。
故這里寫一個(gè)公共的屬性類:BaseAttribute,前面記得加上序列化標(biāo)識(shí)Serializable,代碼如下:
[Serializable]
public class BaseAttribute
{
[XmlAttribute(AttributeName = "ID")]
public string ID { get; set; }
[XmlAttribute(AttributeName = "Text")]
public string Text { get; set; }
}
每個(gè)節(jié)點(diǎn)都有兩個(gè)類,一個(gè)是列表,一個(gè)是實(shí)體,實(shí)體類需繼承公共的類,如下:
[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; }
}
下面幾個(gè)類是用于操作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;
}
}
}
最后就是一個(gè)序列化操作類,如下:
/// <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;
}
}
在后臺(tái)可以這樣調(diào)用,這里沒(méi)用遞歸,如下
private static ZCSoftPlateForm plateForm;
List<MenuTreeData> list = new List<MenuTreeData>();
plateForm = LoadFoundationXml.PlateFormObject;
//使用操作XML類來(lái)讀取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;//上一節(jié)點(diǎn)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屬性設(shè)置為可見(jiàn)true
* (注意:沒(méi)有設(shè)置則默認(rèn)為可見(jiàn)),則菜單的上級(jí)為Module的ID
*/
mData.ParentItem = module.ID;
}
else
{
/*如果該菜單的所屬模塊中的Display屬性設(shè)置為不可見(jiàn)false,
* 則菜單的上級(jí)為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);
}
}
}
}
}
使用到的菜單實(shí)體類:
/// <summary>
/// 系統(tǒng)菜單
/// </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; }
}
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
相關(guān)文章
基于WebRequest.RegisterPrefix的使用詳解
本篇文章對(duì)WebRequest.RegisterPrefix的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C#中實(shí)現(xiàn)在32位、64位系統(tǒng)下自動(dòng)切換不同的SQLite dll文件
這篇文章主要介紹了C#中實(shí)現(xiàn)在32位、64位系統(tǒng)下自動(dòng)切換不同的SQLite dll文件,本文使用C#代碼實(shí)現(xiàn)DLL文件的切換,需要的朋友可以參考下2014-09-09手把手教你如何基于C#制作一個(gè)網(wǎng)址檢測(cè)工具
這篇文章主要給大家介紹了關(guān)于如何基于C#制作一個(gè)網(wǎng)址檢測(cè)工具的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02C#中Dictionary與List的用法區(qū)別以及聯(lián)系詳解
List和Dictionary想必是我們平常用到最多的C#容器了,他們使用起來(lái)都很簡(jiǎn)單,這篇文章主要給大家介紹了關(guān)于C#中Dictionary與List的用法區(qū)別以及聯(lián)系的相關(guān)資料,需要的朋友可以參考下2023-11-11C#中JSON轉(zhuǎn)為實(shí)體類和List以及結(jié)合使用
開發(fā)中經(jīng)常遇到將JSON字符串轉(zhuǎn)換為L(zhǎng)ist的需求,下面這篇文章主要給大家介紹了關(guān)于C#中JSON轉(zhuǎn)為實(shí)體類和List以及結(jié)合使用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01C#實(shí)現(xiàn)數(shù)據(jù)去重的方式總結(jié)
這篇文章主要來(lái)和大家一起來(lái)討論一下關(guān)于C#數(shù)據(jù)去重的常見(jiàn)的幾種方式,每種方法都有其特點(diǎn)和適用場(chǎng)景,感興趣的小伙伴可以了解一下2023-07-07C#實(shí)現(xiàn)讀取指定盤符硬盤序列號(hào)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)讀取指定盤符硬盤序列號(hào)的方法,涉及C#針對(duì)硬件屬性的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08C#將Sql數(shù)據(jù)保存到Excel文件中的方法
這篇文章主要介紹了C#將Sql數(shù)據(jù)保存到Excel文件中的方法,文中的ExportExcel可起到將sql數(shù)據(jù)導(dǎo)出為Excel的作用,需要的朋友可以參考下2014-08-08C#中StringBuilder用法以及和String的區(qū)別分析
當(dāng)我們?cè)诔鯇W(xué)使用C#時(shí),常常會(huì)不知道該用StringBuilder合適還是用String高效,下面是我在學(xué)習(xí)當(dāng)中對(duì)StringBuilder和String的區(qū)別總結(jié),分享給大家。2013-03-03