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();
终端输出图:
反序列化截图如下: