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         }

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

  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/junjieok/p/3470530.html
Copyright © 2011-2022 走看看