对象和XML文件的转换
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
对象和XML文件的转换
很多时候,我们开发程序都需要使用到对象的XML序列化和反序列化,对象的XML序列
化和反序列化,既可以使用XML对象(XmlDocument )进行操作,也可以使用XmlSerializer
进行操作,两个各有优点,就操作性而已,我倾向于使用后者来操作XML。
本文介绍三种方式操作XML,普通的XDocument的API操作,方便的XmlSerializer对
象序列化及反序列化操作,加密XML对象序列化操作。
1、普通的XML对象操作,利用XML对象(XmlDocument )。
一个典型的利用XmlDocument对象操作XML的例子代码如下。
1public static void RunSnippet()
2 {
3 XmlDocument xmldoc = new XmlDocument ( ) ;
4//加入XML的声明段落
5XmlNode xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , "" , "" ) ;
6xmldoc.AppendChild (xmlnode ) ;
7//加入一个根元素
8XmlElement xmlelem = xmldoc.CreateElement ( "" , "ROOT" , "" ) ;
9XmlText xmltext = xmldoc.CreateTextNode ( "Root Text" ) ;
10xmlelem.AppendChild ( xmltext ) ;
11xmldoc.AppendChild ( xmlelem ) ;
12//加入另外一个元素
13XmlElement xmlelem2 = xmldoc.CreateElement ("SampleElement" ) ;
14xmlelem2 = xmldoc.CreateElement ( "" , "SampleElement" , "" ) ;
15xmltext = xmldoc.CreateTextNode ( "The text of the sample element" ) ;
16xmlelem2.AppendChild ( xmltext ) ;
17xmldoc.ChildNodes.Item(1).AppendChild ( xmlelem2 ) ;
18//保存创建好的XML文档
19try
20{
21xmldoc.Save ( "c:\\data.xml" ) ;
22}
23catch ( Exception e )
24{
25//显示错误信息
26Console.WriteLine ( e.Message ) ;
27}
28Console.ReadLine ( ) ;
29 }
得到的输出结果如下所示。
30<?xml version="1.0"?>
31<ROOT>Root Text
32 <SampleElement>The text of the sample element</SampleElement>
33</ROOT>
2、使用XmlSerializer进行XML操作
先提供两个对象的序列化和反序列化的封装函数,如下所示。
1/// <summary>
2 /// 对象序列化XML到文件中
3 /// </summary>
4 /// <param name="path">文件路径</param>
5 /// <param name="obj">对象</param>
6 /// <param name="type">对象类型</param>
7private bool XmlSerialize(string path, object obj, Type type)
8 {
9 XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
10 ns.Add("", "");
11
12try
13 {
14 //如果文件目录不存在,那么创建目录
15if (!File.Exists(path))
16 {
17 FileInfo fi = new FileInfo(path);
18if (!fi.Directory.Exists)
19 {
20 Directory.CreateDirectory(fi.Directory.FullName);
21 }
22 }
23
24 using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
25 {
26 XmlSerializer format = new XmlSerializer(type);
27
28 format.Serialize(stream, obj, ns);
29 stream.Close();
30 }
31
32return true;
33 }
34catch (Exception ex)
35 {
36 Console.WriteLine(ex.Message);
37return false;
38 }
39 }
40
41 /// <summary>
42 /// XML反序列化
43 /// </summary>
44 /// <param name="path">文件路径</param>
45 /// <param name="type">对象类型</param>
46 /// <returns></returns>
47private object XmlDeserialize(string path, Type type)
48 {
49try
50 {
51 using (Stream stream = new FileStream(path, FileMode.Open,
FileAccess.Read, FileShare.Read))
52 {
53 XmlSerializer formatter = new XmlSerializer(type);
54 stream.Seek(0, SeekOrigin.Begin);
55 object obj = formatter.Deserialize(stream);
56 stream.Close();
57return obj;
58 }
59 }
60catch
61 {
62return null;
63 }
64 }
注意其中代码
65XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
66ns.Add("", "");
是把默认的xmlns命名空间多余的内容去掉,这样得到比较干净的XML。
在使用的时候,我们需要定义好对象的实体,这样才能给予对象进行操作,定义的实体类如下所示。
67[Serializable]
68public class UserInfo
69 {
70public string ID { get; set; }
71public string UserNo{ get; set; }
72public string UserName { get; set; }
73public string Sex { get; set; }
74public string Birthday { get; set; }
75 }
76
77 [Serializable]
78public class DataOfUser
79 {
80 [XmlElement(ElementName = "m_User")]
81public List<UserInfo> list = new List<UserInfo>();
82 }
调用序列化函数的代码例子如下所示
83private void btnUserNormal_Click(object sender, EventArgs e)
84 {
85 DataOfUser obj = new DataOfUser();
86 UserInfo user = new UserInfo();
87 user.ID=Guid.NewGuid().ToString();
88 user.Sex = "男";
89 erName = "张三";
90 erNo = "20010001";
91 user.Birthday = "1999-1-1";
92 obj.list.Add(user);
93
94 user = new UserInfo();
95 user.ID = Guid.NewGuid().ToString();
96 user.Sex = "女";
97 erName = "李氏";
98 erNo = "20020001";
99 user.Birthday = "1998-1-1";
100 obj.list.Add(user);
101
102try
103 {
104 XmlSerialize("C:\\User.xml", obj, obj.GetType()); 105 MessageUtil.ShowTips("Ok");
106 }
107catch (Exception ex)
108 {
109 MessageUtil.ShowError(ex.Message);
110 }
111 }
这样得到的XML内容如下所示。
112<?xml version="1.0"?>
113<DataOfUser>
114<m_User>
115<ID>f8a8b323-5c56-4c21-9ddf-1cd30f78dfca</ID>
116<UserNo>20010001</UserNo>
117<UserName>张三</UserName>
118<Sex>男</Sex>
119<Birthday>1999-1-1</Birthday>
120</m_User>
121<m_User>
122<ID>bbb36378-ec27-4e20-ad4b-2d2dc7e142e4</ID>
123<UserNo>20020001</UserNo>
124<UserName>李氏</UserName>
125<Sex>女</Sex>
126<Birthday>1998-1-1</Birthday>
127</m_User>
128</DataOfUser>
反序列化的操作也比较简单,不再赘述。
3)把对象实例化到XML中并进行加密处理
首先我们定义两个序列化加密、解码并反序列化的函数如下所示。
1/// <summary>
2 /// XML序列化并加密
3 /// </summary>
4 /// <param name="path">文件路径</param>
5 /// <param name="obj">对象</param>
6 /// <param name="type">对象类型</param>
7 /// <returns></returns>
8 private bool XmlSerializeEncrypt(string path, object obj, Type type)
9 {
10 XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
11 ns.Add("", "");
12
13 try
14 {
15 if (!File.Exists(path))
16 {
17 FileInfo fi = new FileInfo(path);
18 if (!fi.Directory.Exists)
19 {
20 Directory.CreateDirectory(fi.Directory.FullName);
21 }
22 }
23
24 using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
25 {
26 string content = "";
27 using(MemoryStream ms = new MemoryStream())
28 {
29 XmlSerializer format = new XmlSerializer(type);
30 format.Serialize(ms, obj, ns);
31 ms.Seek(0, 0);
32 content = Encoding.UTF8.GetString(ms.ToArray());
33 }
34
35 string encrypt = EncodeHelper.EncryptString(content);
36 byte[] bytes = Encoding.UTF8.GetBytes(encrypt);
37 stream.Write(bytes, 0, bytes.Length);
38 stream.Close();
39 }
40
41
42 return true;
43 }
44 catch (Exception ex)
45 {
46 Console.WriteLine(ex.Message);
47 return false;
48 }
49 }
50
51 /// <summary>
52 /// 解密并进行XML反序列化
53 /// </summary>
54 /// <param name="path">文件路径</param>
55 /// <param name="type">对象类型</param>
56 /// <returns></returns>
57 private object XmlDeserializeDecrypt(string path, Type type)
58 {
59 try
60 {
61 string encrypt = File.ReadAllText(path, Encoding.UTF8);
62 string content = EncodeHelper.DecryptString(encrypt, true);
63 byte[] bytes = Encoding.UTF8.GetBytes(content);
64 using (MemoryStream stream = new MemoryStream(bytes))
65 {
66 XmlSerializer formatter = new XmlSerializer(type);
67
68 stream.Seek(0, SeekOrigin.Begin);
69 object obj = formatter.Deserialize(stream);
70 stream.Close();
71 return obj;
72 }
73 }
74 catch(Exception ex)
75 {
76 Console.WriteLine(ex.Message);
77 return null;
78 }
79 }
这样函数定义好后,调用和前面没有加密的差不多,如下所示。
80private void btnUserEncrypt_Click(object sender, EventArgs e)
81 {
82 DataOfUser obj = new DataOfUser();
83 UserInfo user = new UserInfo();
84 user.ID = Guid.NewGuid().ToString();
85 user.Sex = "男";
86 erName = "张三";
87 erNo = "20010001";
88 user.Birthday = "1999-1-1";
89 obj.list.Add(user);
90
91 user = new UserInfo();
92 user.ID = Guid.NewGuid().ToString();
93 user.Sex = "女";
94 erName = "李氏";
95 erNo = "20020001";
96 user.Birthday = "1998-1-1";
97 obj.list.Add(user);
98
99 try
100 {
101 XmlSerializeEncrypt("C:\\User-Encrypt.xml", obj,
obj.GetType());
102 MessageUtil.ShowTips("Ok");
103 }
104 catch (Exception ex)
105 {
106 MessageUtil.ShowError(ex.Message);
107 }
108 }
109
110 private void btnUserDecrypt_Click(object sender, EventArgs e) 111 {
112 string file = FileDialogHelper.OpenFile();
113 if (!string.IsNullOrEmpty(file))
114 {
115 DataOfUser info = XmlDeserializeDecrypt(file, typeof(DataOfUser)) as DataOfUser;
116 if (info != null)
117 {
118 MessageUtil.ShowTips("OK");
119 }
120 }
121 }
本文由()整理上传。