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#程序设计有所帮助。