0
点赞
收藏
分享

微信扫一扫

C# Xml与Model互转

若如初梘 2022-02-11 阅读 85
xmlc#.net
public class XmlHelp
    {
        public class SerializerUtility<T>
        {
            private static object _obj = new object();

            public void SetExtraType(Type[] extraTypes)
            {
                _extraTypes = extraTypes;
            }

            private Type[] _extraTypes = null;

            /// <summary>
            /// Xml文件转实体
            /// </summary>
            /// <param name="fileName">文件名</param>
            /// <returns></returns>
            public T XMLToModel(string fileName)
            {
                lock (_obj)
                {
                    XmlSerializer xml;
                    if (_extraTypes == null)
                    {
                        xml = new XmlSerializer(typeof(T));
                    }
                    else
                    {
                        xml = new XmlSerializer(typeof(T), _extraTypes);
                    }
                    //对于文件的操作,有不可控制的异常,所以一定要捕获异常
                    try
                    {
                        if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName))
                        {
                            return default(T);
                        }
                        //使用using在结束的时候关闭FileStream
                        //也可以使用Close()方法关闭
                        using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        {
                            //注意编码方式,如果不是中文环境,对中文会出现乱码
                            using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
                            {
                                object obj = xml.Deserialize(sr);
                                return (T)obj;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //记录日志
                        return default(T);
                    }
                }
            }
            /// <summary>
            /// 实体保存到xml文件
            /// </summary>
            /// <param name="cInfo"></param>
            /// <param name="fileName"></param>
            /// <returns></returns>
            public bool ModelToXml(T cInfo, string fileName)
            {
                lock (_obj)
                {
                    XmlSerializer xml;
                    if (_extraTypes == null)
                    {
                        xml = new XmlSerializer(typeof(T));
                    }
                    else
                    {
                        xml = new XmlSerializer(typeof(T), _extraTypes);
                    }
                    //对于文件的操作,有不可控制的异常,所以一定要捕获异常
                    try
                    {
                        if (string.IsNullOrEmpty(fileName)) return false;
                        //注意编码方式,如果不是中文环境,对中文会出现乱码
                        using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8))
                        {
                            //将命名控件设置为空
                            XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
                            xmlns.Add(String.Empty, String.Empty);

                            xml.Serialize(sw, cInfo, xmlns);
                        }
                        return true;
                    }
                    catch (Exception e)
                    {
                        //记录日志
                        return false;
                    }
                }
            }
            /// <summary>
            /// 实体转xml-实体与xml定义一致
            /// </summary>
            /// <param name="msgInfo"></param>
            /// <returns></returns>
            public string ConvertXml(T msgInfo)
            {
                try
                {
                    XmlSerializer mySerializer = new XmlSerializer(typeof(T));
                    StringBuilder sb = new StringBuilder(4 * 1024);
                    XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
                    namespaces.Add(string.Empty, string.Empty);
                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Encoding = Encoding.UTF8;
                    settings.OmitXmlDeclaration = false;
                    using (XmlWriter myWriter = XmlWriter.Create(sb, settings))
                    {
                        mySerializer.Serialize(myWriter, msgInfo, namespaces);
                    }
                    return sb.ToString();
                }
                catch (System.Exception ex)
                {
                    //记录日志
                    return null;
                }
            }

            /// <summary>
            /// 将xml字符串反序列化为实例-实体与xml定义不一致
            /// </summary>
            /// <param name="xml"></param>
            /// <param name="t"></param>
            /// <returns></returns>
            public  void SetInstanceValueByXMLString(string xml, T model)
            {
                try
                {
                    PropertyInfo[] fields = model.GetType().GetProperties();
                    foreach (PropertyInfo field in fields)
                    {
                        string regexText = string.Format(@"<{0}>([\s\S]*)</{0}>", field.Name);
                        Regex reg = new Regex(regexText);
                        Match match = reg.Match(xml);
                        if (match.Success)
                        {
                            string val = match.Value.Replace("<" + field.Name + ">", "").Replace("</" + field.Name + ">", "");
                            field.SetValue(model, val, null);
                        }
                    }
                }
                catch (Exception ex)
                {
                    //记录日志
                    throw ex;
                }
            }
            /// <summary>
            /// xml字符串转实体
            /// </summary>
            /// <param name="message"></param>
            /// <returns></returns>
            public T ConvertModel(string message)
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    using (XmlReader reader = new XmlTextReader(new StringReader(message)))
                    {
                        object obj = serializer.Deserialize(reader);
                        return (T)obj;
                    }

                }
                catch (System.Exception ex)
                {
                    //记录日志
                    return default(T);
                }
            }            

        }
    }
举报

相关推荐

0 条评论