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

版权所有,禁止匿名转载;禁止商业使用。

 解析XML有很多方法,有个较简单的解析就是用Linq查询。

有如下menu_config.xml

<?xml version="1.0" encoding="utf-8"?>   
<menu_config>   
  <menu title="文章管理" url="~/Article" target="" allow="">   
      <submenu title="列表" url="~/Article/list" allow="" />   
      <submenu />   
      <submenu title="新增" url="~/Article/add" allow="" />   
  </menu>   
  <menu />   
  <menu title="帐号管理" url="~/Admin" />   
</menu_config>

实现过程的代码:

//using System.Collections.Generic;    
//using System.IO;    
//using System.Linq;    
//using System.Xml.Linq;    
//using System.Text;    
    
public class MenuDataModel    
{    
   /*POCO 数据栏位*/    
   public string Title { get; set; }    
   public string Url { get; set; }    
   public string Target { get; set; }    
   public string Allow { get; set; }    
   public string Icon { get; set; }    
   public List<MenuDataModel> Submenu { get; set; }    
    
   /*取得数据清单*/    
   public static List<MenuDataModel> GetList(string menuConfigPath)    
   {    
       /*读取 XML 文件*/    
       var xmlContent = File.ReadAllText(menuConfigPath, Encoding.UTF8);    
       var menuDocument = XDocument.Parse(xmlContent);    
    
       /*利用 LINQ 转成 POCO*/    
       return menuDocument.Root.Elements("menu")    
       .Select(menu => new MenuDataModel    
       {    
           /*取得 Element 上的 Attribute*/    
           Title   = (string) menu.Attribute("title"),    
           Url     = (string) menu.Attribute("url"),    
           Target  = (string) menu.Attribute("target"),    
           Icon    = (string) menu.Attribute("icon") ?? "Item",    
           Allow   = (string) menu.Attribute("allow"),    
    
           /*取得子层 Element 上的 Attribute*/    
           Submenu = menu.Elements("submenu")    
           .Select(sub => new MenuDataModel    
           {    
               Title   = (string) sub.Attribute("title"),    
               Url     = (string) sub.Attribute("url"),    
               Target  = (string) sub.Attribute("target"),    
               Icon    = (string) sub.Attribute("icon") ?? "Item",    
               Allow   = (string) sub.Attribute("allow"),    
           }).ToList(),    
       }).ToList();    
   }    
}    
    
    
void Main()    
{    
   var path = @"D:\menu_config.xml";    
    
   List<MenuDataModel> list =  MenuDataModel.GetList(path);    
    
   list.Dump();


0 0