`
美丽的小岛
  • 浏览: 308193 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

谈谈对象和XML文件的转换 <转>

 
阅读更多

很多时候,我们开发程序都需要使用到对象的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 ( ) ;
    }

 

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

<?xml version="1.0"?>
<ROOT>Root Text
    <SampleElement>The text of the sample element</SampleElement>
</ROOT>

2、使用XmlSerializer进行XML操作

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

/// <summary>
        /// 对象序列化XML到文件中
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="obj">对象</param>
        /// <param name="type">对象类型</param>
        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;
            }
        }

        /// <summary>
        /// XML反序列化
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="type">对象类型</param>
        /// <returns></returns>
        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<UserInfo> list = new List<UserInfo>();
    }

 

调用序列化函数的代码例子如下所示
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内容如下所示。

复制代码
<?xml version="1.0"?>
<DataOfUser>
  <m_User>
    <ID>f8a8b323-5c56-4c21-9ddf-1cd30f78dfca</ID>
    <UserNo>20010001</UserNo>
    <UserName>张三</UserName>
    <Sex></Sex>
    <Birthday>1999-1-1</Birthday>
  </m_User>
  <m_User>
    <ID>bbb36378-ec27-4e20-ad4b-2d2dc7e142e4</ID>
    <UserNo>20020001</UserNo>
    <UserName>李氏</UserName>
    <Sex></Sex>
    <Birthday>1998-1-1</Birthday>
  </m_User>
</DataOfUser>
反序列化的操作也比较简单,不再赘述。

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

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

/// <summary>
        /// XML序列化并加密
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="obj">对象</param>
        /// <param name="type">对象类型</param>
        /// <returns></returns>
        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;
            }
        }

        /// <summary>
        /// 解密并进行XML反序列化
        /// </summary>
        /// <param name="path">文件路径</param>
        /// <param name="type">对象类型</param>
        /// <returns></returns>
        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");
                }
            }
        }
   from:撰写人:伍华聪  http://www.cnblogs.com/wuhuacong/archive/2012/06/29/2569388.html
分享到:
评论

相关推荐

    javabean 与 xml文件转换

    JavaBean和XML之间的转换是Java开发中常见的数据交换方式,特别是在处理配置文件或者进行数据持久化时。这两种格式都有其独特的优势:JavaBean是面向对象的,方便编程,而XML则是一种通用的数据交换格式,易于人阅读...

    Freemarker小demo

    在JSON解析方面,Freemarker本身并不直接支持JSON解析,但我们可以借助Java的JSON库(如Jackson或Gson)将JSON对象转换为Java对象,然后在Freemarker模板中使用这些对象。例如,你可以使用Jackson的`ObjectMapper`将...

    Springboot读取本地json文件工程

    接下来,我们来谈谈JSON(JavaScript Object Notation),这是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在后端开发中,JSON常用于API的数据传输,也常常作为存储配置或者测试数据的...

    用于连接MQ和操作xml文件的实例

    4. 整合MQ和XML:当MQ接收到消息时,解析其中的XML数据,转换为对应的实体对象,再通过Hibernate存入数据库。 通过这个项目,你不仅能学习到MQ的使用,还能加深对XML解析和ORM框架的理解。这将有助于你构建更高效、...

    PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】

    在进行Web开发的过程中,XML(Extensible Markup Language,可扩展标记语言)是一种常用的标记语言,...这些工具能够在开发过程中提供便捷的帮助,使得开发者能够快速检查和修正XML文件的结构和内容,提高开发效率。

    SystemUserDAOImpl.rar_SystemUserDaoImpl_xml classification

    2. 创建XML文档对象,并定义根元素,比如`&lt;users&gt;`。 3. 对于每个用户节点,创建对应的XML元素,如`&lt;user&gt;`,并设置属性(如ID、用户名、父节点ID等)。 4. 将子节点递归地添加到父节点的XML元素下。 5. 最后,将...

    ActionScript3.0的一些实例代码

    `创建了一个XML文档对象,`xml.parseXML("&lt;root&gt;&lt;node&gt;value&lt;/node&gt;&lt;/root&gt;");`将字符串转换为XML结构,然后可以通过`xml.firstChild.nodeValue`访问节点的值。 除此之外,ActionScript 3.0还引入了面向对象编程的...

    json和其他格式相互转换

    Fastjson不仅支持将Java对象转换为JSON字符串,还支持将JSON内容转换为Java对象,这对于数据序列化和反序列化非常有用。其特点包括零依赖、性能优异、API简洁等。例如,你可以使用`JSON.toJSONString(obj)`将Java...

    mybatis入门之级联1对1(无延迟加载)

    例如,假设我们有一个`User`表和一个`Profile`表,每个用户对应一个唯一的个人资料,那么在User实体类中可以有一个Profile属性,而在User的Mapper XML文件中,我们可以编写如下的映射: ```xml &lt;resultMap id=...

    Java实现XML导入不同数据库,从数据库导出数据到XML

    // 读取XML文件并构建Document对象 Document document = builder.build("example.xml"); // 获取根元素 Element rootElement = document.getRootElement(); ``` 在Java中,导入XML数据到不同类型的数据库(如MySQL...

    mybatis深入浅出

    此外,还可以使用&lt;resultMap&gt;来定义复杂结果集的映射,&lt;association&gt;和&lt;collection&gt;元素用于处理嵌套结果。 接下来,我们来谈谈MyBatis的Mapper接口。这些接口允许我们以面向对象的方式执行SQL语句,通过...

    ListView隔行显示

    在Windows编程领域,ListView控件是经常用于...提供的压缩包文件"GlacialList.sln"可能是项目解决方案,"ListView"和"TestGlacialList"可能是实现上述功能的具体代码示例,通过查看这些文件可以得到更具体的实现细节。

    重写linq表达式工具及源码、部分Linq实例

    此外,通过使用`IQueryable&lt;T&gt;`和`IEnumerable&lt;T&gt;`接口,LINQ能够延迟执行查询,提高了性能。 在WPF(Windows Presentation Foundation)中,LINQ可以用于处理数据绑定。WPF的数据绑定机制允许UI元素直接与数据源...

    hao123万年历Web程序.rar

    例如,一个常见的做法是使用JavaScript的Date对象来获取当前日期,然后根据公历和农历的转换算法计算出对应的农历日期。此外,为了实现节假日和节气的显示,开发者可能还需要维护一个包含这些特殊日期的数据库或数组...

    delphi2009解析xml dll小程序

    为了进一步学习和理解这个小程序,你需要解压文件并查看其内容,包括可能的.pas文件(Delphi的源代码文件)、头文件(定义DLL导出的函数)和XML示例文件。 总结来说,这个"delphi2009解析xml dll小程序"涵盖了...

    三级下拉菜单 Javascript(通用版)

    首先,我们需要理解基本的HTML结构,通常三级下拉菜单由`&lt;ul&gt;`和`&lt;li&gt;`元素构建,每个级别用嵌套的`&lt;ul&gt;`表示。CSS用于样式化菜单,使其具有吸引人的视觉效果。然而,为了让菜单具有交互性,我们需要引入JavaScript...

    Java号码归属地查询,xml转化实体类

    可能包含了从XML文件读取数据,调用上述的解析和映射技术,以及显示或验证查询结果的代码。 总结来说,Java号码归属地查询涉及了网络请求、XML解析、数据绑定和实体类的设计。通过理解这些技术,开发者可以构建出...

    SpringMVC纯注解配置

    "SpringMVC纯注解配置"是SpringMVC框架的一种高级用法,旨在减少XML配置文件的使用,提高开发效率和代码可读性。在这个主题中,我们将深入探讨如何利用注解实现SpringMVC的配置以及jQuery如何处理后台返回的JSON对象...

    xsl.rar_excel 数组 java_java xsl_java 表格_为什么读不了XSL文件

    我们可以创建一个`Workbook`对象来读取Excel文件,然后遍历工作表(`Sheet`)和单元格(`Cell`),将数据存储到数组中: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel....

Global site tag (gtag.js) - Google Analytics