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

时间:2022-08-31 13:03:14

背景: 在开发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.下面看看结果吧, 轻松读取数据了

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

 三. 总结

         本篇只是简简单单的谈了一下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&num;基础笔记---浅谈XML读取以及简单的ORM实现

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

  2. C&num;核心基础--浅谈类和对象的概念

    浅谈类和对象的概念 一.什么是类?什么是对象? 学习一门面向对象编程语言,我们必须得知道什么是类?什么是对象? 类(Class)实际上是对某种类型的对象定义变量和方法的原型.它表示对现实生活中一类具有 ...

  3. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. 浅谈XML

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

  5. 爬虫浅谈一:一个简单c&num;爬虫程序

    这篇文章只是简单展示一个基于HTTP请求如何抓取数据的文章,如觉得简单的朋友,后续我们再慢慢深入研究探讨. 图1: 如图1,我们工作过程中,无论平台网站还是企业官网,总少不了新闻展示.如某天产品经理跟 ...

  6. 0基础浅谈反射型xss &lpar;1&rpar;

    0X1:在学习xss之前,先快速学习相关的HTML代码 1.  <input>标签 文本域用法: <input  type="text" /> Type的作 ...

  7. 浅谈XML涉及到的常见技术(编写&plus;解析)

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

  8. 浅谈Servlet读取Html参数

    1首先:webApp名称为cookieAndsession.html文件一般放在WebRoot文件夹下:/cookieAndsession/WebRoot/OrderForm.html,那么外界要访问 ...

  9. 0基础浅谈反射型xss&lpar;2&rpar;

    0x1:回顾前文疑惑“先闭合,在构造” 上一篇,我们说到了xss的一个触发精髓,“先闭合,在构造”,对于前面的先闭合,我们来简单的解释一下:   首先说,为什么要闭合? 因为HTML标签都是成对出现的 ...

随机推荐

  1. LeetCode 204 Count Primes

    Problem: Count the number of prime numbers less than a non-negative number, n. Summary: 判断小于某非负数n的质数 ...

  2. js中获取css的样式

    因为给定一个div宽度或者其他样式之后,再设置一个border的宽度在js中得到的obj.setoffWidth就会变成width加上border的二倍宽度,因此可以自己写一个方法来获取样式.(obj ...

  3. zookeeper启动后没有相关进程

    查看状态报错,报错,百度硕士nc问题,让看.out文件,但是这哥文件是空的,那就看log 016-12-15 14:08:19,355 [myid:] - INFO [main:QuorumPeer$ ...

  4. Objective-C 【NSString-字符串比较&amp&semi;前后缀检查及搜索】

    ———————————————————————————————————————————NSString 字符串比较 #import <Foundation/Foundation.h> vo ...

  5. HTTP报文格式

    请求报文 <method><SP><uri><SP><version><CRLF> <head-name><: ...

  6. 系统uid在1-499的原因

    1.因为是保留给系统使用的UID,为了与用户设置的账户区分,防止冲突. 2.并没有其他特别的意义, 3.也叫作虚拟用户,除了0之外,所有的UID在使用上并没有任何区别. 4.linux中文件和程序都要 ...

  7. Hexo server报错TypeError&colon; Cannot read property &&num;39&semi;utcOffset&&num;39&semi; of null解决方法

    最近刚刚开始使用Hexo,新建了一篇article,运行hexo server时候总是报错Cannot read property 'offset' of null. 最后发现是因为手贱把_confi ...

  8. 用python turtle画玫瑰

    1.turtle 库 2.画玫瑰的代码: import turtle turtle.penup() turtle.left() turtle.fd() turtle.pendown() turtle. ...

  9. 面试:C&plus;&plus;实现访问者模式

    参考:深入应用C++11,访问者模式 #include <iostream> class ConcreteElement1; class ConcreteElement2; class V ...

  10. if &lowbar;&lowbar;name&lowbar;&lowbar;&equals;&equals;&lowbar;&lowbar;main&lowbar;&lowbar;&colon;的应用

    1. if __name__==__main__:代码的作用 python的文件有两种使用的方法:(1)直接作为脚本执行:(2)import到其他的python脚本中被调用(模块重用)执行: 因此if ...