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

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

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

    xml格式如下:

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

    Product对象如下:

    public class Product
        {
            public string Name { get; set; }
    
            public decimal Price { get; set; }
    
            public decimal SupplierId { get; set; }
        }
    View Code

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

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

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

        [XmlRoot("products")]
        public class Products
        {
            [XmlElement("product")]
            public Product[] Items { get; set; }
        }
    View Code
    public class Product
        {
            [XmlAttribute(AttributeName = "name")]
            public string Name { get; set; }
    
            [XmlAttribute(AttributeName = "price")]
            public decimal Price { get; set; }
    
            [XmlAttribute(AttributeName = "supplierId")]
            public decimal SupplierId { get; set; }
        }
    View Code

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

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

    private static IList<Product> products=new List<Product>();
            static LoadXml()
            {
                try
                {
                    using (TextReader reader = new StreamReader("data.xml"))
                    {
                        var serializer = new XmlSerializer(typeof(Products));
                        var items = (Products)serializer.Deserialize(reader);
                        if (items != null)
                        {
                            products = items.Items;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("出错了," + ex.Message);
                }
            }
    View Code

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

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

    private static IList<Product> products=new List<Product>();
            static LoadXml()
            {
                try
                {
                    XDocument doc = XDocument.Load("data.xml");
                    products =
                        doc.Descendants("product")
                           .Select(
                               x =>
                               new Product
                                   {
                                       Name = x.Attribute("name").ToString(),
                                       Price = (decimal)x.Attribute("price"),
                                       SupplierId = (long)x.Attribute("supplierId")
                                   })
                           .ToList();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("出错了," + ex.Message);
                }
            }
    View Code

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

  • 相关阅读:
    寄存器总结
    汇编知识积累
    windbg 配置符号路径
    UNICODE环境下读写txt文件操作
    vs2010 安装项目完成桌面快捷方式无法定位程序文件夹 解决方法
    spring源码解析之属性编辑器propertyEditor
    springboot国际化与@valid国际化支持
    No identifier specified for entity
    springboot 项目中css js 等静态资源无法访问的问题
    Git教程
  • 原文地址:https://www.cnblogs.com/ywcz060/p/3470807.html
Copyright © 2011-2022 走看看