IList与Xml互相转换

using System;
using System.Data;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Reflection;

namespace YKSoft.BLL.Utility
{
/// <summary>
/// 实体转Xml,Xml转实体类
/// </summary>
/// <typeparam name="T"></typeparam>
public class XmlHelper<T> where T : new()
{
#region 实体类转成Xml
/// <summary>
/// 对象实例转成xml
/// </summary>
/// <param name="item">对象实例</param>
/// <returns></returns>
public static string EntityToXml(T item)
{
IList<T> items = new List<T>();
items.Add(item);
return EntityToXml(items);
}

/// <summary>
/// 对象实例集转成xml
/// </summary>
/// <param name="items">对象实例集</param>
/// <returns></returns>
public static string EntityToXml(IList<T> items)
{
//创建XMLDocument文档
XmlDocument doc = new XmlDocument();
//创建根元素
XmlElement root = doc.CreateElement(typeof(T).Name + "s");
//添加根元素的子元素集
foreach (T item in items)
{
EntityToXml(doc,root,item);
}
//向XmlDocument文档添加根元素
doc.AppendChild(root);

return doc.InnerXml;
}

private static void EntityToXml(XmlDocument doc,XmlElement root,T item)
{
//创建元素
XmlElement xmlItem = doc.CreateElement(typeof(T).Name);
//对象的属性集
System.Reflection.PropertyInfo[] propertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

foreach (System.Reflection.PropertyInfo pinfo in propertyInfo)
{
if (pinfo != null)
{
//对象属性名称
string name = pinfo.Name;
//对象属性值
string value = String.Empty;

if (pinfo.GetValue(item,null) != null)
value = pinfo.GetValue(item,null).ToString();//获取对象属性值
//设置元素的属性值
xmlItem.SetAttribute(name,value);
}
}
//向根添加子元素
root.AppendChild(xmlItem);
}


#endregion

#region Xml转成实体类

/// <summary>
/// Xml转成对象实例
/// </summary>
/// <param name="xml">xml</param>
/// <returns></returns>
public static T XmlToEntity(string xml)
{
IList<T> items= XmlToEntityList(xml);
if (items != null && items.Count > 0)
return items[0];
else return default(T);
}

/// <summary>
/// Xml转成对象实例集
/// </summary>
/// <param name="xml">xml</param>
/// <returns></returns>
public static IList<T> XmlToEntityList(string xml)
{
XmlDocument doc = new XmlDocument();
try
{
doc.LoadXml(xml);
}
catch
{
return null;
}
if (doc.ChildNodes.Count != 1)
return null;
if (doc.ChildNodes[0].Name.ToLower() != typeof(T).Name.ToLower() + "s")
return null;

XmlNode node = doc.ChildNodes[0];

IList<T> items = new List<T>();

foreach (XmlNode child in node.ChildNodes)
{
if (child.Name.ToLower() == typeof(T).Name.ToLower())
items.Add(XmlNodetoEntity(child));
}

return items;
}

private static T XmlNodetoEntity(XmlNode node) 
{
T item = new T();

if (node.NodeType == XmlNodeType.Element)
{
XmlElement element = (XmlElement)node;

System.Reflection.PropertyInfo[] propertyInfo = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

foreach (XmlAttribute attr in element.Attributes)
{
string attrName = attr.Name.ToLower();
string attrValue = attr.Value.ToString();
foreach (System.Reflection.PropertyInfo pinfo in propertyInfo)
{
if (pinfo != null)
{
string name = pinfo.Name.ToLower();
Type dbType = pinfo.PropertyType;
if (name == attrName)
{
if (String.IsNullOrEmpty(attrValue))
continue;
switch (dbType.ToString())
{
case "system.int32":
pinfo.SetValue(item,Convert.ToInt32(attrValue),null);
break;
case "System.Boolean":
pinfo.SetValue(item,Convert.ToBoolean(attrValue),null);
break;
case "System.DateTime": 
pinfo.SetValue(item,Convert.ToDateTime(attrValue),null);
break;
case "System.Decimal":
pinfo.SetValue(item,Convert.ToDecimal(attrValue),null);
break;
case "System.Double":
pinfo.SetValue(item,Convert.Todouble(attrValue),null);
break;
default:
pinfo.SetValue(item,attrValue,null);
break;
}
continue;
}
}
}
}
}
return item;
}

#endregion
}

}

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念