c#正反序列化XML文件示例(xml序列化)
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Reflection;
usingSystem.Text;
usingSystem.Text.RegularExpressions;
usingSystem.Xml.Serialization;
usingSystem.IO;
usingSystem;
namespaceGlobalTimes.Framework
{
///<summary>
///XML文本通用解释器
///</summary>
publicclassXmlHelper
{
privateconststringEncodePattern="<[^>]+?encoding=\"(?<enc>[^<>\\s]+)\"[^>]*?>";
privatestaticreadonlyEncodingDefEncoding=Encoding.GetEncoding("gb2312");
privatestaticreadonlyRegexRegRoot=newRegex("<(\\w+?)[>]",RegexOptions.Compiled);
privatestaticreadonlyRegexRegEncode=newRegex(EncodePattern,
RegexOptions.Compiled|RegexOptions.IgnoreCase);
privatestaticreadonlyDictionary<string,XmlSerializer>Parsers=newDictionary<string,XmlSerializer>();
#region解析器
staticEncodingGetEncoding(stringinput)
{
varmatch=RegEncode.Match(input);
if(match.Success)
{
try
{
returnEncoding.GetEncoding(match.Result("${enc}"));
}
//ReSharperdisableEmptyGeneralCatchClause
catch(Exception)
//ReSharperrestoreEmptyGeneralCatchClause
{
}
}
returnDefEncoding;
}
///<summary>
///解析XML文件
///</summary>
///<typeparamname="T">类型</typeparam>
///<paramname="fileName">文件名</param>
///<returns>类的实例</returns>
publicTParseFile<T>(stringfileName)whereT:class,new()
{
varinfo=newFileInfo(fileName);
if(!info.Extension.Equals(".xml",StringComparison.CurrentCultureIgnoreCase)||!info.Exists)
{
thrownewArgumentException("输入的文件名有误!");
}
stringbody;
vartempFileName=PathHelper.PathOf("temp",Guid.NewGuid().ToString().Replace("-","")+".xml");
varfi=newFileInfo(tempFileName);
vardi=fi.Directory;
if(di!=null&&!di.Exists)
{
di.Create();
}
File.Copy(fileName,tempFileName);
using(Streamstream=File.Open(tempFileName,FileMode.Open,FileAccess.Read))
{
using(TextReaderreader=newStreamReader(stream,DefEncoding))
{
body=reader.ReadToEnd();
}
}
File.Delete(tempFileName);
varenc=GetEncoding(body);
if(!Equals(enc,DefEncoding))
{
vardata=DefEncoding.GetBytes(body);
vardest=Encoding.Convert(DefEncoding,enc,data);
body=enc.GetString(dest);
}
returnParse<T>(body,enc);
}
///<summary>
///将对象序列化为XML文件
///</summary>
///<paramname="fileName">文件名</param>
///<paramname="obj">对象</param>
///<returns></returns>
///<exceptioncref="ArgumentException">文件名错误异常</exception>
publicboolSaveFile(stringfileName,objectobj)
{
returnSaveFile(fileName,obj,DefEncoding);
}
///<summary>
///将对象序列化为XML文件
///</summary>
///<paramname="fileName">文件名</param>
///<paramname="obj">对象</param>
///<paramname="encoding"></param>
///<returns></returns>
///<exceptioncref="ArgumentException">文件名错误异常</exception>
publicboolSaveFile(stringfileName,objectobj,Encodingencoding)
{
varinfo=newFileInfo(fileName);
if(!info.Extension.Equals(".xml",StringComparison.CurrentCultureIgnoreCase))
{
thrownewArgumentException("输入的文件名有误!");
}
if(obj==null)returnfalse;
vartype=obj.GetType();
varserializer=GetSerializer(type);
using(Streamstream=File.Open(fileName,FileMode.Create,FileAccess.Write))
{
using(TextWriterwriter=newStreamWriter(stream,encoding))
{
serializer.Serialize(writer,obj);
}
}
returntrue;
}
staticXmlSerializerGetSerializer(Typetype)
{
varkey=type.FullName;
XmlSerializerserializer;
varincl=Parsers.TryGetValue(key,outserializer);
if(!incl||serializer==null)
{
varrootAttrs=newXmlAttributes{XmlRoot=newXmlRootAttribute(type.Name)};
varattrOvrs=newXmlAttributeOverrides();
attrOvrs.Add(type,rootAttrs);
try
{
serializer=newXmlSerializer(type,attrOvrs);
}
catch(Exceptione)
{
thrownewException("类型声明错误!"+e);
}
Parsers[key]=serializer;
}
returnserializer;
}
///<summary>
///解析文本
///</summary>
///<typeparamname="T">需要解析的类</typeparam>
///<paramname="body">待解析文本</param>
///<returns>类的实例</returns>
publicTParse<T>(stringbody)whereT:class,new()
{
varencoding=GetEncoding(body);
returnParse<T>(body,encoding);
}
///<summary>
///解析文本
///</summary>
///<typeparamname="T">需要解析的类</typeparam>
///<paramname="body">待解析文本</param>
///<paramname="encoding"></param>
///<returns>类的实例</returns>
publicTParse<T>(stringbody,Encodingencoding)whereT:class,new()
{
vartype=typeof(T);
varrootTagName=GetRootElement(body);
varkey=type.FullName;
if(!key.Contains(rootTagName))
{
thrownewArgumentException("输入文本有误!key:"+key+"\t\troot:"+rootTagName);
}
varserializer=GetSerializer(type);
objectobj;
using(Streamstream=newMemoryStream(encoding.GetBytes(body)))
{
obj=serializer.Deserialize(stream);
}
if(obj==null)returnnull;
try
{
varrsp=(T)obj;
returnrsp;
}
catch(InvalidCastException)
{
varrsp=newT();
varpisr=typeof(T).GetProperties();
varpiso=obj.GetType().GetProperties();
foreach(varinfoinpisr)
{
varinfo1=info;
foreach(varvalueinfrompropertyInfoinpisowhereinfo1.Name.Equals(propertyInfo.Name)selectpropertyInfo.GetValue(obj,null))
{
info.SetValue(rsp,value,null);
break;
}
}
returnrsp;
}
}
privatestaticXmlSerializerBuildSerializer(Typetype)
{
varrootAttrs=newXmlAttributes{XmlRoot=newXmlRootAttribute(type.Name)};
varattrOvrs=newXmlAttributeOverrides();
attrOvrs.Add(type,rootAttrs);
try
{
returnnewXmlSerializer(type,attrOvrs);
}
catch(Exceptione)
{
thrownewException("类型声明错误!"+e);
}
}
///<summary>
///解析未知类型的XML内容
///</summary>
///<paramname="body">Xml文本</param>
///<paramname="encoding">字符编码</param>
///<returns></returns>
publicobjectParseUnknown(stringbody,Encodingencoding)
{
varrootTagName=GetRootElement(body);
vararray=AppDomain.CurrentDomain.GetAssemblies();
Typetype=null;
foreach(varassemblyinarray)
{
type=assembly.GetType(rootTagName,false,true);
if(type!=null)break;
}
if(type==null)
{
Logger.GetInstance().Warn("加载{0}XML类型失败!",rootTagName);
returnnull;
}
varserializer=GetSerializer(type);
objectobj;
using(Streamstream=newMemoryStream(encoding.GetBytes(body)))
{
obj=serializer.Deserialize(stream);
}
varrsp=obj;
returnrsp;
}
///<summary>
///用XML序列化对象
///</summary>
///<paramname="obj"></param>
///<returns></returns>
publicstringSerialize(objectobj)
{
if(obj==null)returnstring.Empty;
vartype=obj.GetType();
varserializer=GetSerializer(type);
varbuilder=newStringBuilder();
using(TextWriterwriter=newStringWriter(builder))
{
serializer.Serialize(writer,obj);
}
returnbuilder.ToString();
}
#endregion
///<summary>
///获取XML响应的根节点名称
///</summary>
privatestaticstringGetRootElement(stringbody)
{
varmatch=RegRoot.Match(body);
if(match.Success)
{
returnmatch.Groups[1].ToString();
}
thrownewException("InvalidXMLformat!");
}
}
}
相关文章
- 【C#】创建、解析 xml 文件(XmlDocument 方式)
- C# 操作XML文件 XmlDocument和XElement
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax详解编程语言
- MySQL导入XML文件的步骤(mysql导入xml)
- 轻松玩转Linux:修改XML文件的正确打开方式(linux修改xml文件)
- MySQL中解析XML文件的方法(mysql解析xml)
- MySQL 如何导入 XML 文件(mysql导入xml文件)
- Oracle 数据库管理中的 XML 文件定义(.xml oracle)
- Oracle修改XML深入挖掘XML文件的变化(oracle修改xml)
- asp.C#实现图片文件与base64string编码解码
- c#递归访问文件夹(删掉歌词文件)
- c#读取xml文件到datagridview实例
- 浅析C#与C++相关概念的比较
- c#代码自动修改解决方案下任意文件实例
- c#实现数据同步的方法(使用文件监控对象filesystemwatcher)
- c#实现ini文件读写类分享
- c#实现metro文件压缩解压示例
- c#操作xml文件示例
- C#导入导出EXCEL文件的代码实例
- C#泛型集合Dictionary<K,V>的使用方法
- C#采用FileSystemWatcher实现监视磁盘文件变更的方法
- C#运用FileInfo类实现拷贝文件的方法
- C#中csv文件与DataTable互相导入处理实例解析
- C#中子类调用父类的实现方法
- C#基于NPOI生成具有精确列宽行高的Excel文件的方法