2013-05-01 21:59

[C#] 利用 LINQ 解析 XML 至 POCO

menu_config.xml
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <menu_config> 
  3.   <menu title="文章管理" url="~/Article" target="" allow=""> 
  4.       <submenu title="列表" url="~/Article/list" allow="" /> 
  5.       <submenu /> 
  6.       <submenu title="新增" url="~/Article/add" allow="" /> 
  7.   </menu> 
  8.   <menu /> 
  9.   <menu title="帳號管理" url="~/Admin" /> 
  10. </menu_config> 


  1. //using System.Collections.Generic; 
  2. //using System.IO; 
  3. //using System.Linq; 
  4. //using System.Xml.Linq; 
  5. //using System.Text; 
  6.  
  7. public class MenuDataModel 
  8. { 
  9.    /*POCO 資料欄位*/ 
  10.    public string Title { get; set; } 
  11.    public string Url { get; set; } 
  12.    public string Target { get; set; } 
  13.    public string Allow { get; set; } 
  14.    public string Icon { get; set; } 
  15.    public List<MenuDataModel> Submenu { get; set; } 
  16.  
  17.    /*取得資料清單*/ 
  18.    public static List<MenuDataModel> GetList(string menuConfigPath) 
  19.    { 
  20.        /*讀取 XML 檔案*/ 
  21.        var xmlContent = File.ReadAllText(menuConfigPath, Encoding.UTF8); 
  22.        var menuDocument = XDocument.Parse(xmlContent); 
  23.  
  24.        /*利用 LINQ 轉成 POCO*/ 
  25.        return menuDocument.Root.Elements("menu") 
  26.        .Select(menu => new MenuDataModel 
  27.        { 
  28.            /*取得 Element 上的 Attribute*/ 
  29.            Title   = (string) menu.Attribute("title"), 
  30.            Url     = (string) menu.Attribute("url"), 
  31.            Target  = (string) menu.Attribute("target"), 
  32.            Icon    = (string) menu.Attribute("icon") ?? "Item", 
  33.            Allow   = (string) menu.Attribute("allow"), 
  34.  
  35.            /*取得子層級 Element 上的 Attribute*/ 
  36.            Submenu = menu.Elements("submenu") 
  37.            .Select(sub => new MenuDataModel 
  38.            { 
  39.                Title   = (string) sub.Attribute("title"), 
  40.                Url     = (string) sub.Attribute("url"), 
  41.                Target  = (string) sub.Attribute("target"), 
  42.                Icon    = (string) sub.Attribute("icon") ?? "Item", 
  43.                Allow   = (string) sub.Attribute("allow"), 
  44.            }).ToList(), 
  45.        }).ToList(); 
  46.    } 
  47. } 
  48.  
  49.  
  50. void Main() 
  51. { 
  52.    var path = @"D:\menu_config.xml"; 
  53.  
  54.    List<MenuDataModel> list =  MenuDataModel.GetList(path); 
  55.  
  56.    list.Dump(); 
  57. } 

0 回應: