实现实体类和Xml相互转化

本文提供了一种方法,用于将实体类转换为Xml字符串,同时也可以从Xml字符串中读取实体类。支持单个实体类及其实例集合的转换。
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Xml;
  6 
  7  public class XMLHelperToList<T> where T : new()
  8     {
  9         #region 实体类转成Xml
 10         /// <summary>
 11         /// 对象实例转成xml
 12         /// </summary>
 13         /// <param name="item">对象实例</param>
 14         /// <returns></returns>
 15         public static string EntityToXml(T item)
 16         {
 17             IList<T> items = new List<T>();
 18             items.Add(item);
 19             return EntityToXml(items);
 20         }
 21 
 22         /// <summary>
 23         /// 对象实例集转成xml
 24         /// </summary>
 25         /// <param name="items">对象实例集</param>
 26         /// <returns></returns>
 27         public static string EntityToXml(IList<T> items)
 28         {
 29             //创建XmlDocument文档
 30             XmlDocument doc = new XmlDocument();
 31             //创建根元素
 32             XmlElement root = doc.CreateElement(typeof(T).Name + "s");
 33             //添加根元素的子元素集
 34             foreach (T item in items)
 35             {
 36                 EntityToXml(doc, root, item);
 37             }
 38             //向XmlDocument文档添加根元素
 39             doc.AppendChild(root);
 40 
 41             return doc.InnerXml;
 42         }
 43 
 44         private static void EntityToXml(XmlDocument doc, XmlElement root, T item)
 45         {
 46             //创建元素
 47             XmlElement xmlItem = doc.CreateElement(typeof(T).Name);
 48             //对象的属性集
 49             System.Reflection.PropertyInfo[] propertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
 50 
 51             foreach (System.Reflection.PropertyInfo pinfo in propertyInfo)
 52             {
 53                 if (pinfo != null)
 54                 {
 55                     //对象属性名称
 56                     string name = pinfo.Name;
 57                     //对象属性值
 58                     string value = String.Empty;
 59 
 60                     if (pinfo.GetValue(item, null) != null)
 61                         value = pinfo.GetValue(item, null).ToString();//获取对象属性值
 62                     //设置元素的属性值
 63                     xmlItem.SetAttribute(name, value);
 64                 }
 65             }
 66             //向根添加子元素
 67             root.AppendChild(xmlItem);
 68         }
 69 
 70 
 71         #endregion
 72 
 73         #region Xml转成实体类
 74 
 75         /// <summary>
 76         /// Xml转成对象实例
 77         /// </summary>
 78         /// <param name="xml">xml</param>
 79         /// <returns></returns>
 80         public static T XmlToEntity(string xml)
 81         {
 82             IList<T> items = XmlToEntityList(xml);
 83             if (items != null && items.Count > 0)
 84                 return items[0];
 85             else return default(T);
 86         }
 87 
 88         /// <summary>
 89         /// Xml转成对象实例集
 90         /// </summary>
 91         /// <param name="xml">xml</param>
 92         /// <returns></returns>
 93         public static IList<T> XmlToEntityList(string xml)
 94         {
 95             XmlDocument doc = new XmlDocument();
 96             try
 97             {
 98                 doc.LoadXml(xml);
 99             }
100             catch
101             {
102                 return null;
103             }
104             if (doc.ChildNodes.Count != 1)
105                 return null;
106             if (doc.ChildNodes[0].Name.ToLower() != typeof(T).Name.ToLower() + "s")
107                 return null;
108 
109             XmlNode node = doc.ChildNodes[0];
110 
111             IList<T> items = new List<T>();
112 
113             foreach (XmlNode child in node.ChildNodes)
114             {
115                 if (child.Name.ToLower() == typeof(T).Name.ToLower())
116                     items.Add(XmlNodeToEntity(child));
117             }
118 
119             return items;
120         }
121 
122         private static T XmlNodeToEntity(XmlNode node)
123         {
124             T item = new T();
125 
126             if (node.NodeType == XmlNodeType.Element)
127             {
128                 XmlElement element = (XmlElement)node;
129 
130                 System.Reflection.PropertyInfo[] propertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
131 
132                 foreach (XmlAttribute attr in element.Attributes)
133                 {
134                     string attrName = attr.Name.ToLower();
135                     string attrValue = attr.Value.ToString();
136                     foreach (System.Reflection.PropertyInfo pinfo in propertyInfo)
137                     {
138                         if (pinfo != null)
139                         {
140                             string name = pinfo.Name.ToLower();
141                             Type dbType = pinfo.PropertyType;
142                             if (name == attrName)
143                             {
144                                 if (String.IsNullOrEmpty(attrValue))
145                                     continue;
146                                 switch (dbType.ToString())
147                                 {
148                                     case "System.Int32":
149                                         pinfo.SetValue(item, Convert.ToInt32(attrValue), null);
150                                         break;
151                                     case "System.Boolean":
152                                         pinfo.SetValue(item, Convert.ToBoolean(attrValue), null);
153                                         break;
154                                     case "System.DateTime":
155                                         pinfo.SetValue(item, Convert.ToDateTime(attrValue), null);
156                                         break;
157                                     case "System.Decimal":
158                                         pinfo.SetValue(item, Convert.ToDecimal(attrValue), null);
159                                         break;
160                                     case "System.Double":
161                                         pinfo.SetValue(item, Convert.ToDouble(attrValue), null);
162                                         break;
163                                     default:
164                                         pinfo.SetValue(item, attrValue, null);
165                                         break;
166                                 }
167                                 continue;
168                             }
169                         }
170                     }
171                 }
172             }
173             return item;
174         }
175         #endregion
176     }
实体类和Xml相互转化

 

转载于:https://www.cnblogs.com/ziranquliu/p/4672097.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值