读取xml文件转成ListT对象的两种方法(附源码)

读取xml文件转成List<T>对象的两种方法(附源码)

  读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法,加上自己知道的另一种实现方法。

  就以一个简单的xml做例子。

xml格式如下:

1 <?xml version="1.0"?>
2 <products>
3   <product name="West Side Story" price="9.99" supplierId="1" />
4   <product name="Assassins" price="14.99" supplierId="2" />
5   <product name="Frogs" price="13.99" supplierId="1" />
6   <product name="Sweeney Todd" price="10.99" supplierId="3" />
7 </products>

Product对象如下:

1     public class Product
2     {
3         public string Name { get; set; }
4 
5         public decimal Price { get; set; }
6 
7         public decimal SupplierId { get; set; }
8     }

要实现的就是要把xml文件的内容读取出来转成List<Product>对象,需求明白了,那接下来就来介绍实现的方法。

 

一、利用.net中的XmlSerializer类提供的方法

1、首先要在Product、Products类中的每个属性上加上与xml对应的描述字段,如下代码:

    [XmlRoot("products")]public class Products{[XmlElement("product")]public Product[] Items { get; set; }}

 

 1     public class Product
 2     {
 3         [XmlAttribute(AttributeName = "name")]
 4         public string Name { get; set; }
 5 
 6         [XmlAttribute(AttributeName = "price")]
 7         public decimal Price { get; set; }
 8 
 9         [XmlAttribute(AttributeName = "supplierId")]
10         public decimal SupplierId { get; set; }
11     }

注意AttributeName一定要和xml中的一致。

2、相应的对应关系建立好了之后,下面就来进行读取反序列化,代码如下:

 1         private static IList<Product> products=new List<Product>();
 2         static LoadXml()
 3         {
 4             try
 5             {
 6                 using (TextReader reader = new StreamReader("data.xml"))
 7                 {
 8                     var serializer = new XmlSerializer(typeof(Products));
 9                     var items = (Products)serializer.Deserialize(reader);
10                     if (items != null)
11                     {
12                         products = items.Items;
13                     }
14                 }
15             }
16             catch (Exception ex)
17             {
18                 Console.WriteLine("出错了," + ex.Message);
19             }
20         }

这个方法里也没什么特别的就是先读取.xml内容,然后再反Deserialize方法反序化xml内容转成Products。

这种方法大致就这么简单,我个人是比较倾向于这种方法的,因为它不用自己去解析xml中相应的属性等内容,也比较灵活,xml中的属性名变了,在类中相应的属性上改一下AttributeName的值就可以了。

 

二、利用linq进行转换

这个会linq的估计都知道吧,具体不多说了,代码如下:

 1         private static IList<Product> products=new List<Product>();
 2         static LoadXml()
 3         {
 4             try
 5             {
 6                 XDocument doc = XDocument.Load("data.xml");
 7                 products =
 8                     doc.Descendants("product")
 9                        .Select(
10                            x =>
11                            new Product
12                                {
13                                    Name = x.Attribute("name").ToString(),
14                                    Price = (decimal)x.Attribute("price"),
15                                    SupplierId = (long)x.Attribute("supplierId")
16                                })
17                        .ToList();
18             }
19             catch (Exception ex)
20             {
21                 Console.WriteLine("出错了," + ex.Message);
22             }
23         }

以上就是这么多,其实很简单,就是记录下来,做一个笔记,如果各位看官有更好的实现方法,可以分享一下,大家互相学习学习!

 

源码下载

转载于:https://www.cnblogs.com/junjieok/p/3470530.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

委托的运用

下面这篇代码展示了委托的运用,非常精彩,代码版权归"microsoft"所有. 1//版权所有 (C) 2000 Microsoft Corporation。保留所有权利。23//bookstore.cs4usingSystem;56//处理书店的一组类:7namespaceBookstore 8{ 9 using System.Collections; 10 11 // 描述图书…

visual studio enter键代码自动补全

将resharper插件中的设置内容改成这个就可以enter键自动补全了

使用air进行移动app开发常见功能和问题(二)

1、 Air如何判断android、ios 平台网络连接状态&#xff1f; Android&#xff0c;使用as3原生api&#xff1a; [javascript] view plaincopy if(NetworkInfo.isSupported)//只有android支持 NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANG…

虚拟内存相关原理

内存管理1.虚拟内存2.内存分段3.内存分页多级页表TLB1.虚拟内存 众所周知:单片机是没有操作系统的,所以单片机的CPU是直接操作内存的物理地址(physical address,PA) 在这种情况下,程序内存中是无法同时运行多个程序。例如第一个程序在10位置的位置存放立一个数值&#xff0c;…

Team Up!用Visual Studio 2005 Team System组织所有的装备 --作者:Chris Menage

[摘要]本文基于Visual Studio 2005 Team System CTP&#xff0c;为您介绍在软件开发周期中中的开发进程、团队支持、工作项跟踪、单元和装载测试及其他。 软件开发通常被认为是个很困难的过程。前人已经通过组织无数次地学习和编著大量的书籍来阐述如何改进开发应用程序的流程…

贪心算法(leetcode分类解题,C++代码详细注释)

贪心算法前言455.分发饼干135.分发糖果435.无重叠区间605.种花问题452.用最小数量的箭引爆气球763.划分字母区间122. 买卖股票的最佳时机 II376. 摆动序列53. 最大子序和前言 贪心算法或贪心思想采用贪心的策略&#xff0c;保证每次操作都是局部最优的&#xff0c;从而使最后得…

互联网日志的种类、存储和计算

最近几年&#xff0c;经常听到数据挖掘这个词。不过&#xff0c;我仔细看了下&#xff0c;发现这个词还是挺模糊的。挖掘这个词&#xff0c;应该指从数据中发现有价值的信息。比如从搜索词中&#xff0c;发现网民的关注点&#xff0c;进而指导广告投放、产品推荐&#xff0c;生…

[转]2006年十二星座运程 目录

白羊座2006年运程 金牛座2006年运程 双子座2006年运程 巨蟹座2006年运程 狮子座2006年运程 处女座2006年运程 天秤座2006年运程 天蝎座2006年运程 射手座2006年运程 摩羯座2006年运程 水瓶座2006年运程 双鱼座2006年运程作者Blog&#xff1a;http://blog.csdn.net/cndg…

双指针法(leetcode分类解题,C++代码详细注释)

双指针法前言167.两数之和 II - 输入有序数组88.合并两个有序数组142. 环形链表 II633.平方数之和680. 验证回文字符串 Ⅱ27. 移除元素344. 反转字符串剑指 Offer 05. 替换空格151. 翻转字符串里的单词206.反转链表125. 验证回文串19. 删除链表的倒数第 N 个结点面试题 02.02. …

ADSL技术的系统结构

ADSL技术的系统结构 1. ADSL原理和技术性能 现存的用户环路主要由UTP&#xff08;非屏蔽双绞线&#xff09;组成。UTP对信号的衰减主要与传输距离和信号的频率有关&#xff0c;如果信号传输超过一定距离&#xff0c;信号的传输质量将难以保证。此外&#xff0c;线路上的桥接抽头…

DiskSim

1.使用笔记 http://feifei432.blog.163.com/blog/static/140253361201022211949152/ http://feifei432.blog.163.com/blog/static/140253361201022212253597/ 2.安装 http://blog.sina.com.cn/s/blog_448574810101bb65.html转载于:https://www.cnblogs.com/yaolei/p/3487598.ht…

二分法(leetcode分类解题,C++代码详细注释)

二分法前言69. x 的平方根35. 搜索插入位置前言 二分查找也常被称为二分法或者折半查找&#xff0c;每次查找时通过将待查找区间分成两部分并只取一部分继续查找&#xff0c;将查找的复杂度大大减少。对于一个长度为 O(n) 的数组&#xff0c;二分查找的时间复杂度为 O(log n)。…

kernel module required key not available

UEFI主板中禁用Secure Boot转载于:https://www.cnblogs.com/jhaohai/p/3489818.html

我自横刀向天笑,我命由我不由天

那么豪放不羁,慷慨如歌.虽然江湖再来,翠山远逝,肝胆乾坤有去留, 可人生至此,交友如斯,生复何恨,死有何悲呢?我一直在想&#xff0c;“向天笑”的这个笑是怎样的笑&#xff0c;怎样的心情&#xff1f;不有行者&#xff0c;无以图将来&#xff1b;不有死者&#xff0c;无以酬圣猪…