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 }