背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方案之一。下面简单谈谈XML的读取.

 一. 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实现的更多相关文章

  1. C#基础---浅谈XML读取以及简单的ORM实现

    背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方 ...

  2. Java基础之浅谈泛型

    简单的介绍了Java泛型类型的使用.上手容易,深入很难.

  3. 浅谈XML

    什么是 XML? · XML 指可扩展标记语言(EXtensible Markup Language) · XML 是一种标记语言,很类似 HTML · XML 的设计宗旨是传输数据,而非显示数据 · ...

  4. java基础之概谈xml文件解析

    XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...

  5. 【SSH 基础】浅谈Hibernate--入门篇

    Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(Object Relational Mapping)就是把对象里面的数据和数据库里面的数据,依 ...

  6. 浅谈XML涉及到的常见技术(编写+解析)

    xml:即可扩展标记语言,用于描述关系型数据,也经常用作软件的配置文件:     1,编写xml文档一般基于一个约束文档,该文档用于规定xml的书写规范,常用的约束技术有        (1)XML ...

  7. Java基础:浅谈数据输入流/数据输出流《DataInputstream类与DataOutputstream类》

     一.理论概述 数据输入/输出流(DataInputStream类与DataOutputStream类) 允许应用程序以与机器无关的方式从底层输入流中读取基本Java数据类型. 说白了就是,当读取一个 ...

  8. Java基础之浅谈异常与了解断言

    一.产生错误原因 用户输入错误 设备错误 物理限制 代码错误 二.解决错误---异常 在Java中异常对象都是派生于Throwable类的一个实例. 我们一般将异常分为两种:①Error和②Excep ...

  9. Java基础之浅谈集合

    Java基础知识.关于List.Set.Map接口的了解,以及ArrayList.LinkedList.HashSet.TreeSet.HashMap.TreeMap...

随机推荐

  1. loadrunner Analysis :SLA(Service Level Agreement服务水平协议)

    SLA是为负载场景定义的具体目标,用于与实际负载结果比较,确定系统是否达到性能目标. 1.1.1     设置SLA(以Transaction Response Time(Average)为例) 可以 ...

  2. 老司机教你下载tumblr上视频和图片的正确姿势

    本文面向初学者. 很多同学问我:“我非常想学Python编程,但是找不到兴趣点”. 还有的同学呢,找到了很好的兴趣点,但是无从下手,“玄魂老师,我想下载tumblr上的视频, 怎么下载,Python能 ...

  3. com.atomikos.icatch.HeurHazardException: Heuristic Exception

    com.atomikos.icatch.HeurHazardException: Heuristic Exception: 删除Tomcat  bin文件夹下的spring.loglog4j.appe ...

  4. 最快让你上手ReactiveCocoa之基础篇(简称RAC)

    前言 很多blog都说ReactiveCocoa好用,然后各种秀自己如何灵活运用ReactiveCocoa,但是感觉真正缺少的是一篇如何学习ReactiveCocoa的文章,小编看了很多篇都没看出怎么 ...

  5. CardboardSDK-iOS 源码简单分析

    该项目地址: 地址 克隆地址为 https://github.com/rsanchezsaez/CardboardSDK-iOS.git 目前如果想在iOS设备上实现双目VR的功能,Google 已经 ...

  6. shell编程其实真的很简单(三)

    通过前两篇文章,我们掌握了shell的一些基本写法和变量的使用,以及基本数据类型的运算.那么,本次就将要学习shell的结构化命令了,也就是我们其它编程语言中的条件选择语句及循环语句. 不过,在学习s ...

  7. JavaSE 教程的选择

    你好 我是大福 你现在看的是大福笔记 又降温了 下点小雨 出门有点冷 走路到公司20多分钟,又走的有点热 昨天说到了,今年的计划是从零开始重新学习并梳理下这两年学习和接触到的技术 那么今天开始第一个知 ...

  8. java_XML_比较【转】

    JAVA解析XML的方式DOM.SAX.DOM4J.JDOM.StAX之详解与比较 1.各种方式的详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官 ...

  9. 日志组件 logback

    一.简介 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-access.logb ...

  10. ios 动画学习的套路 (二)

    有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! (一) 说说这两个三方库 ...