博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
谈谈对象和XML文件的转换
阅读量:6682 次
发布时间:2019-06-25

本文共 9075 字,大约阅读时间需要 30 分钟。

很多时候,我们开发程序都需要使用到对象的XML序列化和反序列化,对象的XML序列化和反序列化,既可以使用XML对象(XmlDocument )进行操作,也可以使用XmlSerializer进行操作,两个各有优点,就操作性而已,我倾向于使用后者来操作XML。本文介绍三种方式操作XML,普通的XDocument的API操作,方便的XmlSerializer对象序列化及反序列化操作,加密XML对象序列化操作。

1、普通的XML对象操作,利用XML对象(XmlDocument )。

一个典型的利用XmlDocument对象操作XML的例子代码如下。

public static void RunSnippet()    {        XmlDocument xmldoc = new XmlDocument ( ) ;    //加入XML的声明段落    XmlNode xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , "" , "" ) ;    xmldoc.AppendChild (xmlnode ) ;    //加入一个根元素    XmlElement xmlelem = xmldoc.CreateElement ( "" , "ROOT" , "" ) ;    XmlText xmltext = xmldoc.CreateTextNode ( "Root Text" ) ;    xmlelem.AppendChild ( xmltext ) ;    xmldoc.AppendChild ( xmlelem ) ;    //加入另外一个元素    XmlElement xmlelem2 = xmldoc.CreateElement ("SampleElement" ) ;    xmlelem2 = xmldoc.CreateElement ( "" , "SampleElement" , "" ) ;    xmltext = xmldoc.CreateTextNode ( "The text of the sample element" ) ;    xmlelem2.AppendChild ( xmltext ) ;    xmldoc.ChildNodes.Item(1).AppendChild ( xmlelem2 ) ;    //保存创建好的XML文档    try    {      xmldoc.Save ( "c:\\data.xml" ) ;    }    catch ( Exception e )    {      //显示错误信息      Console.WriteLine ( e.Message ) ;    }    Console.ReadLine ( ) ;    }

得到的输出结果如下所示。

Root Text
The text of the sample element

2、使用XmlSerializer进行XML操作

先提供两个对象的序列化和反序列化的封装函数,如下所示。

///         /// 对象序列化XML到文件中        ///         /// 文件路径        /// 对象        /// 对象类型        private bool XmlSerialize(string path, object obj, Type type)        {            XmlSerializerNamespaces ns = new XmlSerializerNamespaces();            ns.Add("", "");            try            {                //如果文件目录不存在,那么创建目录                if (!File.Exists(path))                {                    FileInfo fi = new FileInfo(path);                    if (!fi.Directory.Exists)                    {                        Directory.CreateDirectory(fi.Directory.FullName);                    }                }                using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))                {                    XmlSerializer format = new XmlSerializer(type);                    format.Serialize(stream, obj, ns);                    stream.Close();                }                return true;            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);                return false;            }        }        ///         /// XML反序列化        ///         /// 文件路径        /// 对象类型        /// 
private object XmlDeserialize(string path, Type type) { try { using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { XmlSerializer formatter = new XmlSerializer(type); stream.Seek(0, SeekOrigin.Begin); object obj = formatter.Deserialize(stream); stream.Close(); return obj; } } catch { return null; } }

注意其中代码       

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();     ns.Add("", "");

是把默认的xmlns命名空间多余的内容去掉,这样得到比较干净的XML。

在使用的时候,我们需要定义好对象的实体,这样才能给予对象进行操作,定义的实体类如下所示。

[Serializable]    public class UserInfo    {                        public string ID { get; set; }        public string UserNo{ get; set; }        public string UserName { get; set; }        public string Sex { get; set; }        public string Birthday { get; set; }    }    [Serializable]    public class DataOfUser    {        [XmlElement(ElementName = "m_User")]        public List
list = new List
(); }

调用序列化函数的代码例子如下所示

private void btnUserNormal_Click(object sender, EventArgs e)        {            DataOfUser obj = new DataOfUser();            UserInfo user = new UserInfo();            user.ID=Guid.NewGuid().ToString();            user.Sex = "男";            user.UserName = "张三";            user.UserNo = "20010001";            user.Birthday = "1999-1-1";            obj.list.Add(user);            user = new UserInfo();            user.ID = Guid.NewGuid().ToString();            user.Sex = "女";            user.UserName = "李氏";            user.UserNo = "20020001";            user.Birthday = "1998-1-1";            obj.list.Add(user);            try            {                XmlSerialize("C:\\User.xml", obj, obj.GetType());                MessageUtil.ShowTips("Ok");            }            catch (Exception ex)            {                MessageUtil.ShowError(ex.Message);            }        }

这样得到的XML内容如下所示。

f8a8b323-5c56-4c21-9ddf-1cd30f78dfca
20010001
张三
1999-1-1
bbb36378-ec27-4e20-ad4b-2d2dc7e142e4
20020001
李氏
1998-1-1

反序列化的操作也比较简单,不再赘述。

3)把对象实例化到XML中并进行加密处理

 首先我们定义两个序列化加密、解码并反序列化的函数如下所示。

///         /// XML序列化并加密        ///         /// 文件路径        /// 对象        /// 对象类型        /// 
private bool XmlSerializeEncrypt(string path, object obj, Type type) { XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); try { if (!File.Exists(path)) { FileInfo fi = new FileInfo(path); if (!fi.Directory.Exists) { Directory.CreateDirectory(fi.Directory.FullName); } } using (Stream stream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None)) { string content = ""; using(MemoryStream ms = new MemoryStream()) { XmlSerializer format = new XmlSerializer(type); format.Serialize(ms, obj, ns); ms.Seek(0, 0); content = Encoding.UTF8.GetString(ms.ToArray()); } string encrypt = EncodeHelper.EncryptString(content); byte[] bytes = Encoding.UTF8.GetBytes(encrypt); stream.Write(bytes, 0, bytes.Length); stream.Close(); } return true; } catch (Exception ex) { Console.WriteLine(ex.Message); return false; } } /// /// 解密并进行XML反序列化 /// /// 文件路径 /// 对象类型 ///
private object XmlDeserializeDecrypt(string path, Type type) { try { string encrypt = File.ReadAllText(path, Encoding.UTF8); string content = EncodeHelper.DecryptString(encrypt, true); byte[] bytes = Encoding.UTF8.GetBytes(content); using (MemoryStream stream = new MemoryStream(bytes)) { XmlSerializer formatter = new XmlSerializer(type); stream.Seek(0, SeekOrigin.Begin); object obj = formatter.Deserialize(stream); stream.Close(); return obj; } } catch(Exception ex) { Console.WriteLine(ex.Message); return null; } }

这样函数定义好后,调用和前面没有加密的差不多,如下所示。

private void btnUserEncrypt_Click(object sender, EventArgs e)        {            DataOfUser obj = new DataOfUser();            UserInfo user = new UserInfo();            user.ID = Guid.NewGuid().ToString();            user.Sex = "男";            user.UserName = "张三";            user.UserNo = "20010001";            user.Birthday = "1999-1-1";            obj.list.Add(user);            user = new UserInfo();            user.ID = Guid.NewGuid().ToString();            user.Sex = "女";            user.UserName = "李氏";            user.UserNo = "20020001";            user.Birthday = "1998-1-1";            obj.list.Add(user);            try            {                XmlSerializeEncrypt("C:\\User-Encrypt.xml", obj, obj.GetType());                MessageUtil.ShowTips("Ok");            }            catch (Exception ex)            {                MessageUtil.ShowError(ex.Message);            }        }        private void btnUserDecrypt_Click(object sender, EventArgs e)        {            string file = FileDialogHelper.OpenFile();            if (!string.IsNullOrEmpty(file))            {                DataOfUser info = XmlDeserializeDecrypt(file, typeof(DataOfUser)) as DataOfUser;                if (info != null)                {                    MessageUtil.ShowTips("OK");                }            }        }

 本文转自博客园伍华聪的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
第 8 章 容器网络 - 051 - 在 overlay 中运行容器
查看>>
网络安全系列之三十五 缓冲区溢出
查看>>
第一次做巧克力
查看>>
升级Hbase,解决bug问题
查看>>
java 浅拷贝和深拷贝
查看>>
java 内存模型 ——学习笔记
查看>>
WebBIOS使用手册
查看>>
Linux按照CPU、内存、磁盘IO、网络性能监测
查看>>
获取自定义属性的值
查看>>
linux基础学习(九)
查看>>
Python数据类型详解
查看>>
5.与HTTP协作的Web服务器
查看>>
lvs初步认识
查看>>
Python学习笔记__1.5章 循环
查看>>
控制对文件的访问
查看>>
爱创课堂每日一题第二天8/24日 Quirks模式是什么?它和Standards模式有什么区别?...
查看>>
爱创课堂每日一题第四十天- 说说你对语义化的理解?
查看>>
Spark2.11 两种流操作 + Kafka
查看>>
Linux单磁盘根分区扩容(非LVM)
查看>>
列表的定义、索引、添加、删除、查找、排序
查看>>