天道酬勤

博观而约取,厚积而薄发!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IList与Xml互相转换(转载)

Posted on 2010-06-01 14:12  Happy Coding  阅读(1714)  评论(1编辑  收藏  举报

原文地址:http://www.cnblogs.com/yknb/archive/2009/03/06/1404986.html

我们在进行数据传递时很多用到xml数据格式。数据接收后对数据进行编程操作时,面向对象的方式更容易。

这就需要我们在对象与xml间进行相互的转换。自己写了一个类基本实现了上述功能。

 


  1 using System;
  2 using System.Data;
  3 using System.Collections.Generic;
  4 using System.Text;
  5 using System.Xml;
  6 using System.Reflection;
  7 
  8 namespace YKSoft.BLL.Utility
  9 {
 10     /// <summary>
 11     /// 实体转Xml,Xml转实体类
 12     /// </summary>
 13     /// <typeparam name="T"></typeparam>
 14     public class XmlHelper<T> where T : new()
 15     {
 16         #region 实体类转成Xml
 17         /// <summary>
 18         /// 对象实例转成xml
 19         /// </summary>
 20         /// <param name="item">对象实例</param>
 21         /// <returns></returns>
 22         public static string EntityToXml(T item)
 23         {
 24             IList<T> items = new List<T>();
 25             items.Add(item);
 26             return EntityToXml(items);
 27         }
 28 
 29         /// <summary>
 30         /// 对象实例集转成xml
 31         /// </summary>
 32         /// <param name="items">对象实例集</param>
 33         /// <returns></returns>
 34         public static string EntityToXml(IList<T> items)
 35         {
 36             //创建XmlDocument文档
 37             XmlDocument doc = new XmlDocument();
 38             //创建根元素
 39             XmlElement root = doc.CreateElement(typeof(T).Name + "s");
 40             //添加根元素的子元素集
 41             foreach (T item in items)
 42             {
 43                 EntityToXml(doc, root, item);
 44             }
 45             //向XmlDocument文档添加根元素
 46             doc.AppendChild(root);
 47             
 48             return doc.InnerXml;
 49         }
 50 
 51         private static void EntityToXml(XmlDocument doc, XmlElement root, T item)
 52         {
 53             //创建元素
 54             XmlElement xmlItem = doc.CreateElement(typeof(T).Name);
 55             //对象的属性集
 56            
System.Reflection.PropertyInfo[] propertyInfo =
typeof(T).GetProperties(System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance);

 


 57 
 58             foreach (System.Reflection.PropertyInfo pinfo in propertyInfo)
 59             {
 60                 if (pinfo != null)
 61                 {
 62                     //对象属性名称
 63                     string name = pinfo.Name;
 64                     //对象属性值
 65                     string value = String.Empty;
 66                     
 67                     if (pinfo.GetValue(item, null!= null)
 68                         value = pinfo.GetValue(item, null).ToString();//获取对象属性值
 69                     //设置元素的属性值
 70                     xmlItem.SetAttribute(name,value);
 71                 }
 72             }
 73             //向根添加子元素
 74             root.AppendChild(xmlItem);
 75         }
 76 
 77        
 78         #endregion
 79 
 80         #region Xml转成实体类
 81 
 82         /// <summary>
 83         /// Xml转成对象实例
 84         /// </summary>
 85         /// <param name="xml">xml</param>
 86         /// <returns></returns>
 87         public static T XmlToEntity(string xml)
 88         {
 89            IList<T> items= XmlToEntityList(xml);
 90            if (items != null && items.Count > 0)
 91                return items[0];
 92            else return default(T);
 93         }
 94 
 95         /// <summary>
 96         /// Xml转成对象实例集
 97         /// </summary>
 98         /// <param name="xml">xml</param>
 99         /// <returns></returns>
100         public static IList<T> XmlToEntityList(string xml)
101         {
102             XmlDocument doc = new XmlDocument();
103             try
104             {
105                 doc.LoadXml(xml);
106             }
107             catch
108             {
109                 return null;
110             }
111             if (doc.ChildNodes.Count != 1)
112                 return null;
113             if (doc.ChildNodes[0].Name.ToLower() != typeof(T).Name.ToLower() + "s")
114                 return null;
115 
116             XmlNode node = doc.ChildNodes[0];
117 
118             IList<T> items = new List<T>();
119 
120             foreach (XmlNode child in node.ChildNodes)
121             {
122                 if (child.Name.ToLower() == typeof(T).Name.ToLower())
123                     items.Add(XmlNodeToEntity(child));
124             }
125 
126             return items;
127         }
128 
129         private static T XmlNodeToEntity(XmlNode node) 
130         {
131             T item = new T();
132 
133             if (node.NodeType == XmlNodeType.Element)
134             {
135                 XmlElement element = (XmlElement)node;
136 
137                 System.Reflection.PropertyInfo[] propertyInfo =
typeof
(T).GetProperties(System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance);
138 
139                 foreach (XmlAttribute attr in element.Attributes)
140                 {
141                     string attrName = attr.Name.ToLower();
142                     string attrValue = attr.Value.ToString();
143                     foreach (System.Reflection.PropertyInfo pinfo in propertyInfo)
144                     {
145                         if (pinfo != null)
146                         {
147                             string name = pinfo.Name.ToLower();
148                             Type dbType = pinfo.PropertyType;
149                             if (name == attrName)
150                             {
151                                 if (String.IsNullOrEmpty(attrValue))
152                                     continue;
153                                 switch (dbType.ToString())
154                                 {
155                                     case "System.Int32":
156                                         pinfo.SetValue(item, Convert.ToInt32(attrValue), null);
157                                         break;
158                                     case "System.Boolean":
159                                         pinfo.SetValue(item, Convert.ToBoolean(attrValue), null);
160                                         break;
161                                     case "System.DateTime"
162                                         pinfo.SetValue(item, Convert.ToDateTime(attrValue), null);
163                                         break;
164                                     case "System.Decimal":
165                                         pinfo.SetValue(item, Convert.ToDecimal(attrValue), null);
166                                         break;
167                                     case "System.Double":
168                                         pinfo.SetValue(item, Convert.ToDouble(attrValue), null);
169                                         break;
170                                     default:
171                                         pinfo.SetValue(item, attrValue, null);
172                                         break;
173                                 }
174                                 continue;
175                             }
176                         }
177                     }
178                 }
179             }
180             return item;
181         }
182 
183         #endregion
184     }
185        
186 }
187