C#基础---浅谈XML读取以及简单的ORM实现
2017-03-17 13:33
495 查看
背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方案之一。下面简单谈谈XML的读取.
一. xml.linq读取xml
1.新建一个data.XML文件
2. 新建customer实体
3. System.Xml.Linq 域名. 就可以轻松将customer信息读取完毕。XDocument.Load读取xml文件. Descendants可以读取Customer节点返回一个集合.再通过Linq的select方法.读取每个Customer节点数据,转换成List<Customer>对象
二. 简单的ORM
上面介绍了XML的读取,那XML读取有没有可以更简单的方式呢. 比如类似于Database的ORM框架. 只需要实体名称与DB SQL的select字段名称一样就会自动映射到实体上面。不需要我们去写代码一个一个去Element上取。 下面我们就来简单实现一个。下面代码只是提供思路
其实我们可以通过反射和打标签来实现, 大家有空不妨去看看小弟写得两篇 打标签和反射的文章。
C#基础---Attribute(标签) 和 reflect(反射) 应用
C#基础---Attribute(标签) 和 reflect(反射) 应用二
1.新建XmlAttribute类。提供了ElementName属性用于标记实体类字段对应的xml节点
2. 修改新建的Customler类. ElementName 对应的xml节点名称, 因为有可能开发者xml节点名称和实体名称不一样。
3. 提供XmlReader类,用于读取xml数据
1.先通过反射读取实体,比如Customer类的 字段名称和对应的xml节点名称存入到dic 字典里面.
2.遍历字段,取值赋给实体
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/
一. xml.linq读取xml
1.新建一个data.XML文件
<Customers> <Customer> <Name>Frank</Name> <City>成都</City> <Contact>2233</Contact> </Customer> <Customer> <Name>Vincent</Name> <City>美国</City> <Contact>4455</Contact> </Customer> </Customers>
2. 新建customer实体
public class Customers { public string Name { get; set; } public string City { get; set; } public string Contact { get; set; } }
3. System.Xml.Linq 域名. 就可以轻松将customer信息读取完毕。XDocument.Load读取xml文件. Descendants可以读取Customer节点返回一个集合.再通过Linq的select方法.读取每个Customer节点数据,转换成List<Customer>对象
var customsers = XDocument.Load("data.xml").Descendants("Customer") .Select(x => new Customers() { Name = x.Element("Name").Value, City = x.Element("City").Value, Contact = x.Element("Contact").Value, }).ToList();
二. 简单的ORM
上面介绍了XML的读取,那XML读取有没有可以更简单的方式呢. 比如类似于Database的ORM框架. 只需要实体名称与DB SQL的select字段名称一样就会自动映射到实体上面。不需要我们去写代码一个一个去Element上取。 下面我们就来简单实现一个。下面代码只是提供思路
其实我们可以通过反射和打标签来实现, 大家有空不妨去看看小弟写得两篇 打标签和反射的文章。
C#基础---Attribute(标签) 和 reflect(反射) 应用
C#基础---Attribute(标签) 和 reflect(反射) 应用二
1.新建XmlAttribute类。提供了ElementName属性用于标记实体类字段对应的xml节点
public class XmlAttribute : Attribute { public string ElementName { get; set; } }
2. 修改新建的Customler类. ElementName 对应的xml节点名称, 因为有可能开发者xml节点名称和实体名称不一样。
public class Customers { [Xml(ElementName = "Name")] public string Name { get; set; } [Xml(ElementName = "City")] public string City { get; set; } [Xml(ElementName = "Contact")] public string Contact { get; set; } }
3. 提供XmlReader类,用于读取xml数据
1.先通过反射读取实体,比如Customer类的 字段名称和对应的xml节点名称存入到dic 字典里面.
2.遍历字段,取值赋给实体
public class XmlReader { public static List<T> ReadList<T>(string filePath,string rootName) where T:class,new () { List<PropertyInfo> propertyInfos = ((T)Activator.CreateInstance(typeof(T))).GetType().GetProperties().ToList(); List<T> result = new List<T>(); var xmlData = XDocument.Load(filePath); //存储实体 属性名称--xml对应节点名称 的key-value值 Dictionary<string, string> dic = new Dictionary<string, string>(); propertyInfos .ForEach(property => { var attribute = property.GetCustomAttribute(typeof(XmlAttribute)) as XmlAttribute; if (attribute != null) { dic.Add(property.Name, attribute.ElementName); } }); return xmlData .Descendants(rootName) .Select(element => { // 实例化一个对象 var info = (T)Activator.CreateInstance(typeof(T)); //遍历keyvalue字段,给实体每个字段赋值 foreach (KeyValuePair<string, string> pair in dic) { // 读取对象的filed标签 var attr = info.GetType().GetProperty(pair.Key); attr.SetValue(info, element.Element(pair.Value).Value); } return info; }).ToList(); } }
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/
相关文章推荐
- C#基础---浅谈XML读取以及简单的ORM实现
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础:抽象类和抽象方法实现多态以及简单工厂设计模式的语法
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)
- C#基础系列:实现自己的ORM(构造我自己的ORM)
- C#基础系列3:实现自己的ORM…
- C#基础--.net平台的重要组成部分以及.net程序简单的编译原理
- C#基础系列:实现自己的ORM(MiniORM的测试代码)
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- C#串口介绍以及简单串口通信程序设计实现
- shader学习基础之十一实现纹理的缩放平移和旋转,以及用c#代码合并两种贴图并且控制位置
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- [Songqw.Net 基础]C#实现简单的插件化开发,可用于WPF Winform.
- C#基础系列:实现自己的ORM(构造我自己的ORM)
- C#基础系列:实现自己的ORM(构造我自己的ORM)
- C#基础之计算器的简单实现
- C#基础系列:实现自己的ORM(ORM的基础概念)