本文實例講述了C#使用XML序列化操作菜單的方法。分享給大家供大家參考。具體分析如下:
之前的一篇文章《C#遞歸讀取XML菜單數據的方法》沒使用XML序列化來操作菜單,而且發現那還有一個問題,就是在XML菜單的某個菜單節點前加上一些注釋代碼的就不能讀取,現在使用XML序列化后可以很方便的讀取,故在此寫一寫。
XML菜單的節點代碼如下:
這里面有一個節點:Applications(應用程序節點),里面可以放多個Application,而每個Application節點里面只包含一個Modules(模塊節點),Modules有多個Module,每個Module又只有一個Menus(菜單節點),而Menus里有多個Menu。而每個節點都有兩個公共的屬性:ID和Text。
故這里寫一個公共的屬性類:BaseAttribute,前面記得加上序列化標識Serializable,代碼如下:
[XmlAttribute(AttributeName = "Text")]
public string Text { 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的,代碼如下:
/// <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;
}
}
}
最后就是一個序列化操作類,如下:
在后臺可以這樣調用,這里沒用遞歸,如下
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);
}
}
}
}
}
使用到的菜單實體類:
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#程序設計有所幫助。
新聞熱點
疑難解答