using System.Text; using System.Xml; using System.Xml.Serialization; namespace YLErp.Helpers { public class XmlHelper { #region 序列化 /// /// 序列化object对象为XML字符串 /// /// 要序列化的类 /// 是否缩进 /// 结果 public static string Serializable(object ObjectToSerialize, bool indent = false) { string result = null; try { #region 去除XML自带命名空间 var ns = new XmlSerializerNamespaces(); ns.Add("", ""); #endregion #region 去除XML声明 var setting = new XmlWriterSettings(); setting.Indent = indent; setting.Encoding = Encoding.Default; #endregion var xmlSerializer = new XmlSerializer(ObjectToSerialize.GetType()); using (var memoryStream = new MemoryStream()) { var xmlTextWriter = new XmlTextWriter(memoryStream, new UTF8Encoding(false)); xmlTextWriter.Formatting = indent ? Formatting.Indented : Formatting.None; xmlSerializer.Serialize(xmlTextWriter, ObjectToSerialize, ns);//最后一个ns参数为指定命名空间 xmlTextWriter.Flush(); xmlTextWriter.Close(); var uTF8Encoding = new UTF8Encoding(false, true); result = uTF8Encoding.GetString(memoryStream.ToArray()); } } catch (Exception innerException) { throw new ApplicationException("Couldn't Serialize Object:" + ObjectToSerialize.GetType().Name, innerException); } return result; } #endregion #region 反序列化 /// /// 反序列化XML字符串为指定类型 /// /// 转换后的类型 /// 包含XML的字符串 /// 是否忽略属性里的换行符 /// public static T Deserialize(string xmlString, bool normalization = true) { var rt = default(T); var xmlSerializer = new XmlSerializer(typeof(T)); using (Stream xmlStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlString))) { if (!normalization) { using (var reader = new XmlTextReader(xmlStream)) { // 注意一定要创建出一个 XmlTextReader出来, // 因为MS默认的 reader.Normalization = true // 设置成false就不会把回车去掉了 reader.Normalization = false; var obj = xmlSerializer.Deserialize(reader); rt = (T)obj; } } else { var obj = xmlSerializer.Deserialize(xmlStream); rt = (T)obj; } } return rt; } #endregion #region 格式化 /// /// 格式化显示Xml /// /// Xml字符串 /// 格式化后的Xml字符串 public static string FormatXml(string source) { StringBuilder sb = new StringBuilder(); XmlTextWriter writer = null; try { XmlDocument doc = new XmlDocument(); doc.LoadXml(source); writer = new XmlTextWriter(new StringWriter(sb)); writer.Formatting = Formatting.Indented; doc.WriteTo(writer); } finally { if (writer != null) writer.Close(); } return sb.ToString(); } #endregion } }