zoukankan      html  css  js  c++  java
  • 读取xml文件转成List<T>对象的两种方法(附源码)

    读取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         }

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

  • 相关阅读:
    python3从尾到头打印链表
    替换空格
    二维数组中的查找
    堪比福尔摩斯的破案新科技!快来了解一下
    好莱坞首部全亚裔主演电影上映,华人终于谈恋爱了
    《呼啸山庄》:爱之深,恨之切,死相依
    《碟中谍 6:全面瓦解》口碑爆棚,登顶北美周末票房
    让重刑犯做瑜伽:新西兰人性化监狱的故事
    python面试笔试题汇总
    centos7 重置root 密码
  • 原文地址:https://www.cnblogs.com/junjieok/p/3470530.html
Copyright © 2011-2022 走看看