很多时候,我们开发程序都需要使用到对象的XML序列化和反序列化,对象的XML序列化和反序列化,既可以使用XML对象(XmlDocument)进行操作,也可以使用XmlSerializer进行操作,两个各有优点,就是操作性而已,我倾向于使用后者来操作XML。

本文介绍三种方式操作XML,普通的XmlDocument的API操作,方便的XmlSerializer对象序列化操作,加密XML对象序列化操作。

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

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

public static void RunShipper(){

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.Messate);

}

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>

//</summary>

private bool XmlSerialize(Striing 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.Serializer(sream,obj,ns);

stream.Close();

}

return true;

}catch(Excetion e)

{

Console.WriteLine(e.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 UseNo{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 cotext = "";

using(MemorySream ms = new MemorySream());

{

XmlSerializer format = new XmlSerializer(type);

format.Serializer(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(Excetion e)

{

Console.WriteLine(e.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){

MessateUtil.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");

}

}

}

对象和XML文件的转换的更多相关文章

  1. C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...

  2. C#对象与XMl文件之间的相互转换(转)

    本文是对C#中对象与XMl文件之间的相互转换进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使 ...

  3. 字符串对象跟xml格式的转换

    package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...

  4. JAXB—Java类与XML文件之间转换

    JAXB-Java类与XML文件之间转换 简介         JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生 ...

  5. C#.Net 持久化对象为XML文件

    </pre><pre code_snippet_id="613717" snippet_file_name="blog_20150307_1_57950 ...

  6. JAXB 实现java对象与xml之间互相转换

    首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...

  7. 使用XPath对象解析xml文件

    使用XPath对象解析xml文件 1.DocumentBuilderFactory类  工厂API,使应用程序能从XML文档获取生成DOM对象树的解析器 其构造方法受保护,用newInstance() ...

  8. jaxb 专题一(JAXB 实现java对象与xml之间互相转换)

    首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...

  9. java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.javaimport java.io.FileInputStream; import java.io.FileWriter; i ...

随机推荐

  1. 快速熟悉Oracle索引

    一.索引 1.1 什么是索引? 一种用于提升查询效率的数据库对象: 通过快速定位数据的方法,减少磁盘的输入输出操作: 索引信息与表独立存放: Oracle数据库自动使用和维护索引. 1.2 索引分类 ...

  2. 记一次线上coredump事故

    1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发生在业务低峰期,而且该模块提供的功能也不是核心流程功能,所以对线上业务影响比较小.发生coredump后,运维收到 ...

  3. 记录一下Maven整合spring,hibernate,strusts2我程序中出的bug

    action类如下 package com.itheima.movenweb.action; import java.util.List; import org.apache.struts2.Serv ...

  4. PLSQL 创建自定义函数注意事项

    2017-6-8周四,今天遇到的需求是,从数据库中查找出某张表的某些数据,并将这些数据做简单的加减运算再得到结果集,没有思路,后来问辉哥,给我的建议是给这些运算封装成一个SQL函数,select选择字 ...

  5. truffle 安装以及基本指令

    1. linux下安装方式 $ npm install -g truffle 环境要求: NodeJS 5.0+ Windows,Linux,或Mac OS X 2. 创建工程: $ mkdir te ...

  6. [C#]使用 C# 编写自己的区块链挖矿算法

    [C#] 使用 C# 编写自己区块链的挖矿算法 文章原文来自:Code your own blockchain mining algorithm in Go! ,原始文章通过 Go 语言来实现的,这里 ...

  7. 清理out的浏览器收藏夹发现的

    刚才清理了一下自己的浏览器书签,其实好几年不做收藏了,常用的直接放到书签栏里就行了. 发现不少之前的技术内容域名都被色情病毒经营者续费利用,相关技术内容都是VB.SQL.XMAPP这些过期的玩意,其中 ...

  8. 使用ASP.NET SignalR实现一个简单的聊天室

    前言 距离我写上一篇博客已经又过了一年半载了,时间过得很快,一眨眼,就把人变得沧桑了许多.青春是短暂的,知识是无限的.要用短暂的青春,去学无穷无尽的知识,及时当勉励,岁月不待人.今天写个随笔小结记录一 ...

  9. 大数据与Mapreduce

    第十五章 大数据与Maprudece 一.引言 实际生活中的数据量是非常庞大的,采用单机运行的方式可能需要若干天才能出结果,这显然不符合我们的预期,为了尽快的获得结果,我们将采用分布式的方式,将计算分 ...

  10. (四)SpringBoot2.0基础篇- 多数据源,JdbcTemplate和JpaRepository

    在日常开发中,经常会遇到多个数据源的问题,而SpringBoot也有相关API:Configure Two DataSources:https://docs.spring.io/spring-boot ...