C#实现复杂XML的序列化与反序列化
本文以一个实例的形式讲述了C#实现复杂XML的序列化与反序列化的方法。分享给大家供大家参考。具体方法如下:
已知.xml(再此命名default.xml)文件,请将其反序列化到一个实例对象。
Default.XML文件如下:
<?xmlversion="1.0"encoding="utf-8"?> <config> <rules> <rulename="namea"> <params> <itemname="p"type="get"pattern="(ios|android|)"/> <itemname="cid"type="get"pattern="(ios|android|)"/> <itemname="type"type="get"pattern="(ios|android|)"/> <itemname="sort"type="get"pattern="(ios|android|)"/> <itemname="action"type="post"pattern="(ios|android|)"/> <itemname="userAgent"type="header"pattern="(ios|android|)"/> </params> </rule> <rulename="nameb"> <params> <itemname="p"type="get"pattern="(ios|android|)"/> <itemname="cid"type="get"pattern="(ios|android|)"/> <itemname="type"type="get"pattern="(ios|android|)"/> <itemname="sort"type="get"pattern="(ios|android|)"/> <itemname="action"type="post"pattern="(ios|android|)"/> <itemname="userAgent"type="header"pattern="(ios|android|)"/> </params> </rule> <rulename="namec"> <params> <itemname="p"type="get"pattern="(ios|android|)"/> <itemname="cid"type="get"pattern="(ios|android|)"/> <itemname="type"type="get"pattern="(ios|android|)"/> <itemname="sort"type="get"pattern="(ios|android|)"/> <itemname="action"type="post"pattern="(ios|android|)"/> <itemname="userAgent"type="header"pattern="(ios|android|)"/> </params> </rule> <rulename="named"> <params> <itemname="p"type="get"pattern="(ios|android|)"/> <itemname="cid"type="get"pattern="(ios|android|)"/> <itemname="type"type="get"pattern="(ios|android|)"/> <itemname="sort"type="get"pattern="(ios|android|)"/> <itemname="action"type="post"pattern="(ios|android|)"/> <itemname="userAgent"type="header"pattern="(ios|android|)"/> </params> </rule> </rules> </config>
C#示例代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Xml.Serialization;
namespace多层级反序列
{
[XmlType(TypeName="config")]
publicclassXmlConfig
{
[XmlArray("rules")]
publicList<rule>rules{get;set;}
}
[XmlType(TypeName="rule")]
publicclassrule
{
[XmlAttribute]
publicstringname{get;set;}
[XmlArray("params")]
publicList<paramsItem>@params{get;set;}
}
[XmlType(TypeName="item")]
publicclassparamsItem
{
[XmlAttribute]
publicstringname{get;set;}
[XmlAttribute]
publicstringtype{get;set;}
[XmlAttribute]
publicstringpattern{get;set;}
}
classProgram
{
staticvoidMain(string[]args)
{
/*
XmlConfigxml1=DeserializeFromXml<XmlConfig>("default.xml");
XmlConfigxml=newXmlConfig();
SerializeToXml<XmlConfig>("default.xml",xml);
*/
XmlConfigxml1=DeserializeFromXml<XmlConfig>("default.xml");
}
///<summary>
///XML序列化某一类型到指定的文件
///</summary>
///<paramname="filePath"></param>
///<paramname="obj"></param>
///<paramname="type"></param>
publicstaticvoidSerializeToXml<T>(stringfilePath,Tobj)
{
try
{
using(System.IO.StreamWriterwriter=newSystem.IO.StreamWriter(filePath))
{
System.Xml.Serialization.XmlSerializerxs=newSystem.Xml.Serialization.XmlSerializer(typeof(T));
xs.Serialize(writer,obj);
}
}
catch(Exceptionex)
{
}
}
///<summary>
///从某一XML文件反序列化到某一类型
///</summary>
///<paramname="filePath">待反序列化的XML文件名称</param>
///<paramname="type">反序列化出的</param>
///<returns></returns>
publicstaticTDeserializeFromXml<T>(stringfilePath)
{
try
{
if(!System.IO.File.Exists(filePath))
thrownewArgumentNullException(filePath+"notExists");
using(System.IO.StreamReaderreader=newSystem.IO.StreamReader(filePath))
{
System.Xml.Serialization.XmlSerializerxs=newSystem.Xml.Serialization.XmlSerializer(typeof(T));
Tret=(T)xs.Deserialize(reader);
returnret;
}
}
catch(Exceptionex)
{
returndefault(T);
}
}
}
}
PS:这里再为大家提供几款关于xml操作的在线工具供大家参考使用:
在线XML/JSON互相转换工具:
http://tools.jb51.net/code/xmljson
在线格式化XML/在线压缩XML:
http://tools.jb51.net/code/xmlformat
XML在线压缩/格式化工具:
http://tools.jb51.net/code/xml_format_compress
希望本文所述对大家的C#程序设计有所帮助。