using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Reflection; using System.Xml; using System.Xml.Serialization; using System.IO; using System.Xml.Schema; namespace Erp.WebClient.Common { public static class XmlUtility { #region XML与实体类之间的转换 /// <summary> /// /// </summary> /// <param name="obj"></param> /// <param name="toBeIndented"></param> /// <param name="type"></param> /// <returns></returns> public static string ObjectToXml(object obj,bool toBeIndented,Type type) { if (obj == null) { throw new ArgumentNullException("obj"); } UTF8Encoding encoding = new UTF8Encoding(false); XmlSerializer serializer = new XmlSerializer(type); MemoryStream stream = new MemoryStream(); XmlTextWriter writer = new XmlTextWriter(stream,encoding); writer.Formatting = (toBeIndented ? Formatting.Indented : Formatting.None); serializer.Serialize(writer,obj); string xml = encoding.GetString(stream.ToArray()); writer.Close(); return xml; } /// <summary> /// /// </summary> /// <param name="xml"></param> /// <param name="type"></param> /// <returns></returns> public static object XmlToObject(string xml,Type type) { if (xml == null) { throw new ArgumentNullException("xml"); } object o = null; XmlSerializer serializer = new XmlSerializer(type); StringReader strReader = new StringReader(xml); XmlReader reader = new XmlTextReader(strReader); try { o = serializer.Deserialize(reader); } catch (InvalidOperationException e) { throw e; } catch (Exception e) { throw e; } finally { reader.Close(); } return o; } /// <summary> /// 实体类序列化成xml /// </summary> /// <param name="enitities">实体.</param> /// <param name="headtag">节点名称</param> /// <returns></returns> public static string ObjectListToXml<T>(List<T> enitities,string headtag) { StringBuilder sb = new StringBuilder(); PropertyInfo[] propinfos = null; sb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); sb.AppendLine("<" + headtag + ">"); foreach (T obj in enitities) { //初始化propertyinfo if (propinfos == null) { Type objtype = obj.GetType(); propinfos = objtype.GetProperties(); } sb.AppendLine("<ProductList>"); foreach (PropertyInfo propinfo in propinfos) { sb.Append("<"); sb.Append(propinfo.Name); sb.Append(">"); sb.Append(propinfo.GetValue(obj,null)); sb.Append("</"); sb.Append(propinfo.Name); sb.AppendLine(">"); } sb.AppendLine("</ProductList>"); } sb.AppendLine("</" + headtag + ">"); return sb.ToString(); } //xml转行为实体类 /// <summary> /// xml文件转化为实体类列表 /// </summary> /// <typeparam name="T">实体名称</typeparam> /// <param name="xml">xml文件</param> /// <param name="headtag">xml头文件</param> /// <returns>实体列表</returns> public static List<T> XmlToObjectList<T>(string xml,string headtag) where T : new() { List<T> list = new List<T>(); XmlDocument doc = new XmlDocument(); PropertyInfo[] propinfos = null; doc.LoadXml(xml); //XmlNodeList nodelist = doc.SelectNodes(headtag); XmlNodeList nodelist = doc.GetElementsByTagName(headtag); foreach (XmlNode node in nodelist) { T entity = new T(); //初始化propertyinfo if (propinfos == null) { Type objtype = entity.GetType(); propinfos = objtype.GetProperties(); } //填充entity类的属性 foreach (PropertyInfo propinfo in propinfos) { //实体类字段首字母变成小写的 string name = propinfo.Name.Substring(0,1) + propinfo.Name.Substring(1,propinfo.Name.Length - 1); XmlNode cnode = node.SelectSingleNode(name); string v = cnode.InnerText; if (!string.IsNullOrEmpty(v)) { propinfo.SetValue(entity,Convert.ChangeType(v,propinfo.PropertyType),null); } } list.Add(entity); } return list; } #endregion } }
3. 类的设计
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ComponentModel; using System.Xml.Serialization; using System.ServiceModel; using System.Runtime.Serialization; namespace GlacierICR.Common.WorkDataTypes { public enum DecimalLimitType { NotSet,MoreThan,MoreThanEqual,LessThan,LessThanEqual,} //[DataContract(Namespace = "http://tempuri.org/")] [XmlInclude(typeof(ClientUIType))] [KnownType(typeof(ClientUIType))] public class ClientUIConfigSetting { public ClientUIConfigSetting() { this.ClientUITypeSetCollection = new List<ClientUIType>(); } public bool HasRemarks { get; set; } public List<ClientUIType> ClientUITypeSetCollection { get; set; } } [XmlInclude(typeof(SingleOption))] [XmlInclude(typeof(MulOption))] [XmlInclude(typeof(DateSelection))] [XmlInclude(typeof(SingleLineTextBox))] [XmlInclude(typeof(MulLineTextBox))] [XmlInclude(typeof(DecimalTextBox))] [KnownType(typeof(SingleOption))] [KnownType(typeof(MulOption))] [KnownType(typeof(DateSelection))] [KnownType(typeof(SingleLineTextBox))] [KnownType(typeof(MulLineTextBox))] [KnownType(typeof(DecimalTextBox))] public abstract class ClientUIType { public string Name { get; set; } } public class SingleOption : ClientUIType { public string[] OptionItems { get; set; } public bool HasOther { get; set; } } public class MulOption : ClientUIType { public string[] OptionItems { get; set; } public bool HasOther { get; set; } } public class DateSelection : ClientUIType { } public class SingleLineTextBox : ClientUIType { public int Length { get; set; } } public class MulLineTextBox : ClientUIType { public int Length { get; set; } } public class DecimalTextBox : ClientUIType { public decimal MinValue { get; set; } public decimal MaxValue { get; set; } public string Unit { get; set; } public DecimalLimitType MinDecimalLimitType { get; set; } public DecimalLimitType MaxDecimalLimitType { get; set; } } }