Xml反序列化

XmlHelper帮助类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Xml.Linq;
using System.IO;
using System.Xml.Serialization;
using System.Reflection;

namespace PushToolCompare
{
    public class XmlHelper
    {
        /// <summary>
        ///  返回实体类List
        /// </summary>
        /// <param name="filePath">xml文件目录</param>
        /// <param name="nodeParentName">父结点名称</param>
        /// <param name="nodeName">结点名称</param>
        /// <param name="nodeAncestorsName">祖父结点名称</param>
        /// <returns></returns>
        public static List<T> ConverToModelList<T>(string filePath, string nodeParentName, string nodeName, string nodeAncestorsName = "") where T:new()
        {
            List<T> lists = new List<T>();
            XElement xe = XElement.Load(@filePath);
            XElement ancestors = string.IsNullOrEmpty(nodeAncestorsName) ? xe.Element(nodeParentName) : xe.Element(nodeAncestorsName).Element(nodeParentName);
            IEnumerable<XElement> childrenItems = ancestors.Elements(nodeName);
            foreach (XElement node in childrenItems)
            {
                T SampleModel = new T();
                foreach (XElement item in node.Elements())
                {
                    foreach (PropertyInfo property in SampleModel.GetType().GetProperties())
                    {
                        if (item.Name == property.Name)
                        {
                            if (item.Value != "[Null]")
                            {
                                property.SetValue(SampleModel,
                                    Convert.ChangeType(item.Value, property.PropertyType),
                                    null);
                                break;
                            }
                            else
                                property.SetValue(SampleModel, null, null);
                        }
                    }
                }
                lists.Add(SampleModel);
            }
            return lists;
        }

        public static T Deserialize<T>(string filePath)
        {
            if (File.Exists(filePath))
            {
                using (StreamReader sr=new StreamReader(filePath))
                {
                    return Deserialize<T>(sr);
                }
            }         
            throw new ArgumentException($"{filePath}文件不存在");
        }

        public static T Deserialize<T>(StreamReader sr)
        {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            return (T)xs.Deserialize(sr);
        }
    }
}

 

XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<PushConfig>
  <IOS>
    <XinGe>
      <token>86bc327e9ab11d764339aa2f5101eb085ba974b5</token>
    </XinGe>
    <JiGuang>
      <token>1a0018970a9e1c3c9cc</token>
      <token>1a0018970a9ee500231</token>
    </JiGuang>
    <Umeng>
      <token>ApHw6vB3T90ys8Pu8RDzv8bWucROICfH6WAZyig2t2f3</token>
    </Umeng>
  </IOS>
  <Android>
    <XinGe>
      <token>ed47412a78d9b81cf110f91e66db6a7ae942fa3f8e22206977fd0d405eb48265</token>
    </XinGe>
    <JiGuang>
      <token>101d8559097f4a634fb</token>
    </JiGuang>
    <Umeng>
      <token>123</token>
      <token>456</token>
    </Umeng>
  </Android>
</PushConfig>

 

XML文件对应的实体类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace PushToolCompare.Config
{
    [Serializable]
    [XmlType(TypeName = "PushConfig")]
    public class PushConfig
    {
        [XmlElement(ElementName = "IOS")]
        public IOS ios { get; set; }
        [XmlElement(ElementName = "Android")]
        public Android android { get; set; }
    }

    [Serializable]
    [XmlType(TypeName = "IOS")]
    public class IOS
    {
        [XmlElement(ElementName = "XinGe")]
        public XinGe xinGe { get; set; }

        [XmlElement(ElementName = "JiGuang")]
        public JiGuang jiGuang { get; set; }

        [XmlElement(ElementName = "Umeng")]
        public Umeng umeng { get; set; }
    }

    [Serializable]
    [XmlType(TypeName = "Android")]
    public class Android
    {
        [XmlElement(ElementName = "XinGe")]
        public XinGe xinGe { get; set; }

        [XmlElement(ElementName = "JiGuang")]
        public JiGuang jiGuang { get; set; }

        [XmlElement(ElementName = "Umeng")]
        public Umeng umeng { get; set; }
    }

    [XmlType(TypeName = "XinGe")]
    public class XinGe
    {
        [XmlElement("token")]
        public List<string> token { get; set; }
    }

    [XmlType(TypeName = "JiGuang")]
    public class JiGuang
    {
        [XmlElement("token")]
        public List<string> token { get; set; }
    }

    [XmlType(TypeName = "Umeng")]
    public class Umeng
    {
        [XmlElement("token")]
        public List<string> token { get; set; }
    }
}

生成代码:

            PushConfig pushConfig = XmlHelper.Deserialize<PushConfig>(PushConfigPath);

 

posted @ 2017-04-20 16:49  花生打代码会头痛  阅读(144)  评论(0)    收藏  举报