对象和XML文件的转换
很多时候,我们开发程序都需要使用到对象的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文件的转换的更多相关文章
- C#对象与XMl文件之间的相互转换
C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...
- C#对象与XMl文件之间的相互转换(转)
本文是对C#中对象与XMl文件之间的相互转换进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使 ...
- 字符串对象跟xml格式的转换
package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...
- JAXB—Java类与XML文件之间转换
JAXB-Java类与XML文件之间转换 简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生 ...
- C#.Net 持久化对象为XML文件
</pre><pre code_snippet_id="613717" snippet_file_name="blog_20150307_1_57950 ...
- JAXB 实现java对象与xml之间互相转换
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...
- 使用XPath对象解析xml文件
使用XPath对象解析xml文件 1.DocumentBuilderFactory类 工厂API,使应用程序能从XML文档获取生成DOM对象树的解析器 其构造方法受保护,用newInstance() ...
- jaxb 专题一(JAXB 实现java对象与xml之间互相转换)
首先熟悉一下JAXB实现对象与xml互转时常用的一些注解使用: 1.@XmlRootElement,用于类级别的注解,对应xml的跟元素.通过name属性定义这个根节点的名称. 2.@XmlAcces ...
- java读取xml文件并转换成对象,并进行修改
1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.javaimport java.io.FileInputStream; import java.io.FileWriter; i ...
随机推荐
- LeetCode(39)-Intersection of Two Linked Lists
听歌曲初爱有感: 开头啰嗦两句,刚在做算法题目的时候,听到了杨宗纬的<初爱>,突然有了一种本科时候的感觉,想想自己现在研二了,青春喂了狗,我果断喝了一罐啤酒,循环这首歌到吐-.. 题目: ...
- Win10家庭版中的SQL2005无法远程连接
最近公司重新更换了电脑,电脑自事Win10家庭版本.在安装开发工具中发现有不少的问题,如无法安装SQL Server 2005,无法安装VS2013等.最终通过网上寻找安装SQL Server 200 ...
- Python 可视化TVTK CubeSource管线初使用
CubeSource对象是长方体数据源对象.本次在安装成功TVTK库的基础上显示一个长方体对象.通过以下代码,我们设置一个长宽高分别为1.0,2.0,3.0的长方体数据源并通过管线显示出来. from ...
- tomcat 工作原理
Tomcat原理 分类: TOMCAT2009-05-17 22:25 4366人阅读 评论(3) 收藏 举报 tomcatexceptionsocketstringservernull Tomcat ...
- ffmpeg 的 tbr tbc 和 tbn的意义
tbn = the time base in AVStream that has come from the container tbc = the time base in AVCodecConte ...
- PHP实现zip压缩打包下载
先来看PHP实现文件及文件夹的zip压缩 这里使用PHP扩展的ZipArchive类,在使用之前要将php.ini文件中的zlib.output_compression设置为On 代码如下: publ ...
- 这就是我想要的 VSCode 插件!
简评:VSCode 是一个开源的跨平台编辑器,是我最满意的 IDE 之一.本文介绍了几种使用的插件,确实解决了很多的痛点. Quokka.js Quokka.js 会在您键入代码编辑器中显示各种执行结 ...
- ThinkPHP简单的验证码实现
ThinkPHP简单的验证码实现 写一个最简单的TP验证码. 写Controller 首先在Controller/IndexController.class.php(简称Index)文件中编辑: &l ...
- Ocelot中文文档-认证
为了验证ReRoutes并随后使用Ocelot的任何基于声明的功能,如授权或使用令牌中的值修改请求. 用户必须像往常一样在他们的Startup.cs中注册认证服务,但他们给每个注册提供了一个方案(认证 ...
- EF Code First中的主外键约定和一对一、一对多关系的实现
对于主外键约定的理解,其实是学习实体间一对一和一对多关系的基础. 1.1 主键(Key)约定 主键的默认约定是:只要字段名为--实体名(类名)+"id"(不区分大小写),这就算是默 ...