C#基礎---淺談XML讀取以及簡單的ORM實現


     背景: 在開發ASP.NETMVC4 項目中,雖然web.config配置滿足了大部分需求,不過對於某些特定業務,我們有時候需要添加新的配置文件來記錄配置信息,那么XML文件配置無疑是我們選擇的一個方案之一。下面簡單談談XML的讀取.

     一. xml.linq讀取xml

       1.新建一個data.XML文件

 1 <Customers>
 2   <Customer>
 3     <Name>Frank</Name>
 4     <City>成都</City>
 5     <Contact>2233</Contact>
 6   </Customer>
 7   <Customer>
 8     <Name>Vincent</Name>
 9     <City>美國</City>
10     <Contact>4455</Contact>
11   </Customer>
12 </Customers>

    2. 新建customer實體

1     public class Customers
2     {
3         public string Name { get; set; }
4 
5         public string City { get; set; }
6 
7         public string Contact { get; set; }
8     }

   3. System.Xml.Linq 域名. 就可以輕松將customer信息讀取完畢。XDocument.Load讀取xml文件. Descendants可以讀取Customer節點返回一個集合.再通過Linq的select方法.讀取每個Customer節點數據,轉換成List<Customer>對象

1  var customsers = XDocument.Load("data.xml").Descendants("Customer")
2                 .Select(x => new Customers()
3                 {
4                     Name = x.Element("Name").Value,
5                     City = x.Element("City").Value,
6                     Contact = x.Element("Contact").Value,
7                 }).ToList();

    二. 簡單的ORM

       上面介紹了XML的讀取,那XML讀取有沒有可以更簡單的方式呢. 比如類似於Database的ORM框架. 只需要實體名稱與DB SQL的select字段名稱一樣就會自動映射到實體上面。不需要我們去寫代碼一個一個去Element上取。 下面我們就來簡單實現一個。下面代碼只是提供思路

       其實我們可以通過反射和打標簽來實現, 大家有空不妨去看看小弟寫得兩篇 打標簽和反射的文章。

        C#基礎---Attribute(標簽) 和 reflect(反射) 應用

        C#基礎---Attribute(標簽) 和 reflect(反射) 應用二

       1.新建XmlAttribute類。提供了ElementName屬性用於標記實體類字段對應的xml節點

1 public class XmlAttribute : Attribute
2     {
3         public string ElementName
4         {
5             get;
6             set;
7         }
8     }

       2. 修改新建的Customler類. ElementName 對應的xml節點名稱, 因為有可能開發者xml節點名稱和實體名稱不一樣。

 1     public class Customers
 2     {
 3 
 4         [Xml(ElementName = "Name")]
 5 
 6         public string Name { get; set; }
 7 
 8         [Xml(ElementName = "City")]
 9 
10         public string City { get; set; }
11 
12         [Xml(ElementName = "Contact")]
13 
14         public string Contact { get; set; }
15     }

       3. 提供XmlReader類,用於讀取xml數據

          1.先通過反射讀取實體,比如Customer類的 字段名稱和對應的xml節點名稱存入到dic 字典里面.

          2.遍歷字段,取值賦給實體

 1     public class XmlReader
 2     {
 3         public static List<T> ReadList<T>(string filePath,string rootName) where T:class,new ()
 4         {
 5             List<PropertyInfo> propertyInfos = ((T)Activator.CreateInstance(typeof(T))).GetType().GetProperties().ToList();
 6             List<T> result = new List<T>();
 7             var xmlData = XDocument.Load(filePath);
 8 
 9             //存儲實體 屬性名稱--xml對應節點名稱 的key-value值
10             Dictionary<string, string> dic = new Dictionary<string, string>();
11             propertyInfos
12                 .ForEach(property =>
13                 {
14                     var attribute = property.GetCustomAttribute(typeof(XmlAttribute)) as XmlAttribute;
15                     if (attribute != null)
16                     {
17                         dic.Add(property.Name, attribute.ElementName);
18                     }
19                 });
20 
21             return xmlData
22                 .Descendants(rootName)
23                 .Select(element =>
24                 {
25                     // 實例化一個對象
26                     var info = (T)Activator.CreateInstance(typeof(T));
27 
28                     //遍歷keyvalue字段,給實體每個字段賦值
29                     foreach (KeyValuePair<string, string> pair in dic)
30                     {
31                         // 讀取對象的filed標簽
32                         var attr = info.GetType().GetProperty(pair.Key);
33                         attr.SetValue(info, element.Element(pair.Value).Value);
34                     }
35                     return info;
36                 }).ToList();
37         }
38     }

         4.下面看看結果吧, 輕松讀取數據了

     

     三. 總結

         本篇只是簡簡單單的談了一下XML讀取,xml的類型很多,比如在<customer name='frank' />這些情況也沒有考慮。此類情況如果要再次封裝。就需要在XmlAttribute類新增一個AttributeName來實現。而且數據類型除開string,還有int,datetime等。以及xml的嵌套,多層解析xml數據等等。網上應該有很多讀取xml的框架,我相信很多公司也會有自己的xml讀取的框架。雖然沒必要重造輪子。但是作為一個開發者還是可以去想想。如果自己要去開發這些公共框架,也應該知道怎么去做,知道可以通過什么方式去實現。

         更多C#基礎筆記,請點擊下面鏈接: http://www.cnblogs.com/FourLeafCloverZc/tag/C%23%E5%9F%BA%E7%A1%80%E7%AC%94%E8%AE%B0/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM