zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C#实现复杂XML的序列化与反序列化

c#XML 实现 复杂 序列化
2023-06-13 09:15:45 时间

本文以一个实例的形式讲述了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操作的在线工具供大家参考使用:

希望本文所述对大家的C#程序设计有所帮助。