zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    HDU 4588 Count The Carries(找规律,模拟)
    HDU 4287 Intelligent IME(string,map,stl,make_pair)
    make_pair() (STL)
    HDU 4022 Bombing(stl,map,multiset,iterater遍历)
    hdu 2094 产生冠军(STL,set)
    zoj 2358,poj 1775 Sum of Factorials(数学题)
    浅谈this在普通函数里情况
    浅谈offset
    常见的一些属性操作
    明天就是七夕情人节了,还在为找对象的事而烦恼吗?单身的点进来看一看了啊,都是干货
  • 原文地址:https://www.cnblogs.com/FourLeafCloverZc/p/6565589.html
Copyright © 2011-2022 走看看