C# XML序列化与反序列化
引用:
using System.IO;
using System.Xml.Serialization;
XML序列化接口(直接copy就能用)
public static string XMLSerialize(Type type,object obj)
{
string xmlMessage = string.Empty;
try
{
// 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(type);
using (MemoryStream ms = new MemoryStream())
{
using (StreamWriter writer = new StreamWriter(ms, Encoding.GetEncoding("gb2312")))
{
serializer.Serialize(writer, obj, ns);
xmlMessage = Encoding.GetEncoding("gb2312").GetString(ms.GetBuffer());//gb2312编码
}
}
}
catch (Exception ex)
{
Console.WriteLine("{0}", ex.Message);
return null;
}
return xmlMessage;
}
反序列化接口
public static object XMLDeserialize(Type type, string xml)
{
try
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(sr);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
接口调用
string str = XMLSerialize(typeof(root), rt); //root是类名 rt是类对象
Console.WriteLine(str); //打印xml
root Root = XMLDeserialize(typeof(root), str) as root; //xml解析完成获取类对象
例如封装以下格式的xml
<?xml version="1.0" encoding="gb2312"?>
<root command="TestXml">
<xmlInfo>student</xmlInfo>
<item command="student" number="1">
<paraters>
<name>hello</name>
<classNo>r1</classNo>
<sex>boy</sex>
<birthday>10/23</birthday>
<year>2017</year>
</paraters>
</item>
</root>
定义类的个数: 从<?xml version="1.0" encoding="gb2312"?>下面一行代码开始, 有xml格式有几层, 就定义(层数-1)个类, 例如:root属于第一层, xmlinfo 和item 属于第二层, parters属于第三层,name,classNo, sex, birthday, year属于第四层, 所以要定义3个类
定义类的结构: 类的结构根据当前层的属性 和 下一层的节点名称来定义: 例如: class root{属性:command, 节点1:xmlinfo, 节点2: item}, class item{属性 command 节点1:
paraters} class paraters{节点1:name, 节点2: classNo, 节点3: sex, 节点4: birthday, 节点5: year}
定义结构代码如下:
public class root
{
[XmlAttribute] // 注明command为属性, 因为不注明就默认为节点XmlElement
public string command = "TestXml";
public string xmlInfo { set;get; } //默认为节点XmlElement
public Item item { set; get; }
}
public class Item
{
[XmlAttribute]// 注明command为属性, 因为不注明就默认为节点XmlElement
public string command = "student";
[XmlAttribute]// 注明number 为属性, 因为不注明就默认为节点XmlElement
public string number { set; get; }
public Paraters paraters { set; get; }
}
public class Paraters
{
public string name { set; get;}
public string classNo { set; get; }
public string sex { set; get; }
public string birthday { set; get; }
public string year { set; get; }
}
生成Xml: 直接new 对象, 对对象中的属性赋值即可
root rt = new root();
rt.xmlInfo = "student";
rt.item = new Item();
rt.item.number = "1";
rt.item.paraters = new Paraters();
rt.item.paraters.birthday = "10/23";
rt.item.paraters.classNo = "r1";
rt.item.paraters.name = "hello";
rt.item.paraters.sex = "boy";
rt.item.paraters.year = "2017";
string str = XMLSerialize(typeof(root), rt);
Console.WriteLine(str);
root Root = XMLDeserialize(typeof(root), str) as root;
Console.ReadKey();

生成多个节点相同的名字的xml:格式如下---------------->一下有三个节点名字都为Paraters
<?xml version="1.0" encoding="gb2312"?> <root command="TestXml"> <xmlInfo>student</xmlInfo> <item command="student"> <Items> <Paraters> <name>hello</name> <classNo>r1</classNo> <sex>boy</sex> <birthday>10/23</birthday> <year>20</year> </Paraters> <Paraters> <name>hello</name> <classNo>r1</classNo> <sex>boy</sex> <birthday>10/23</birthday> <year>201</year> </Paraters> <Paraters> <name>hello</name> <classNo>r1</classNo> <sex>boy</sex> <birthday>10/23</birthday> <year>2018</year> </Paraters> </Items> <number>1</number> </item> </root>
这个格式的xml类主要修改一下 Item类中的一个属性即可:类结构如下所示
public class root //没变
{
[XmlAttribute]
public string command = "TestXml";
public string xmlInfo { set;get; }
public Item item { set; get; }
}
public class Item
{
[XmlAttribute]
public string command = "student";
public string number { set; get; }
public List<Paraters> Items; //只修改了这里, 编程list容器
}
public class Paraters //没变
{
public string name { set; get;}
public string classNo { set; get; }
public string sex { set; get; }
public string birthday { set; get; }
public string year { set; get; }
}
生成以上格式xml代码:如下:
root rt = new root();
rt.xmlInfo = "student";
rt.item = new Item();
rt.item.number = "1";
rt.item.Items = new List<Paraters>();
Paraters paraters = new Paraters();
paraters.birthday = "10/23";
paraters.classNo = "r1";
paraters.name = "hello";
paraters.sex = "boy";
paraters.year = "20";
rt.item.Items.Add(paraters);
Paraters parater = new Paraters();
parater.birthday = "10/23";
parater.classNo = "r1";
parater.name = "hello";
parater.sex = "boy";
parater.year = "201";
rt.item.Items.Add(parater);
Paraters parater1 = new Paraters();
parater1.birthday = "10/23";
parater1.classNo = "r1";
parater1.name = "hello";
parater1.sex = "boy";
parater1.year = "2018";
rt.item.Items.Add(parater1);
string str = XMLSerialize(typeof(root), rt);
Console.WriteLine(str);
root Root = XMLDeserialize(typeof(root), str) as root;
Console.ReadKey();
终端输出图:

反序列化截图如下:


浙公网安备 33010602011771号