很多时候,我们开发程序都需要使用到对象的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之间的转换是Java开发中常见的数据交换方式,特别是在处理配置文件或者进行数据持久化时。这两种格式都有其独特的优势:JavaBean是面向对象的,方便编程,而XML则是一种通用的数据交换格式,易于人阅读...
在JSON解析方面,Freemarker本身并不直接支持JSON解析,但我们可以借助Java的JSON库(如Jackson或Gson)将JSON对象转换为Java对象,然后在Freemarker模板中使用这些对象。例如,你可以使用Jackson的`ObjectMapper`将...
接下来,我们来谈谈JSON(JavaScript Object Notation),这是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在后端开发中,JSON常用于API的数据传输,也常常作为存储配置或者测试数据的...
4. 整合MQ和XML:当MQ接收到消息时,解析其中的XML数据,转换为对应的实体对象,再通过Hibernate存入数据库。 通过这个项目,你不仅能学习到MQ的使用,还能加深对XML解析和ORM框架的理解。这将有助于你构建更高效、...
在进行Web开发的过程中,XML(Extensible Markup Language,可扩展标记语言)是一种常用的标记语言,...这些工具能够在开发过程中提供便捷的帮助,使得开发者能够快速检查和修正XML文件的结构和内容,提高开发效率。
2. 创建XML文档对象,并定义根元素,比如`<users>`。 3. 对于每个用户节点,创建对应的XML元素,如`<user>`,并设置属性(如ID、用户名、父节点ID等)。 4. 将子节点递归地添加到父节点的XML元素下。 5. 最后,将...
`创建了一个XML文档对象,`xml.parseXML("<root><node>value</node></root>");`将字符串转换为XML结构,然后可以通过`xml.firstChild.nodeValue`访问节点的值。 除此之外,ActionScript 3.0还引入了面向对象编程的...
Fastjson不仅支持将Java对象转换为JSON字符串,还支持将JSON内容转换为Java对象,这对于数据序列化和反序列化非常有用。其特点包括零依赖、性能优异、API简洁等。例如,你可以使用`JSON.toJSONString(obj)`将Java...
例如,假设我们有一个`User`表和一个`Profile`表,每个用户对应一个唯一的个人资料,那么在User实体类中可以有一个Profile属性,而在User的Mapper XML文件中,我们可以编写如下的映射: ```xml <resultMap id=...
// 读取XML文件并构建Document对象 Document document = builder.build("example.xml"); // 获取根元素 Element rootElement = document.getRootElement(); ``` 在Java中,导入XML数据到不同类型的数据库(如MySQL...
此外,还可以使用<resultMap>来定义复杂结果集的映射,<association>和<collection>元素用于处理嵌套结果。 接下来,我们来谈谈MyBatis的Mapper接口。这些接口允许我们以面向对象的方式执行SQL语句,通过...
在Windows编程领域,ListView控件是经常用于...提供的压缩包文件"GlacialList.sln"可能是项目解决方案,"ListView"和"TestGlacialList"可能是实现上述功能的具体代码示例,通过查看这些文件可以得到更具体的实现细节。
此外,通过使用`IQueryable<T>`和`IEnumerable<T>`接口,LINQ能够延迟执行查询,提高了性能。 在WPF(Windows Presentation Foundation)中,LINQ可以用于处理数据绑定。WPF的数据绑定机制允许UI元素直接与数据源...
例如,一个常见的做法是使用JavaScript的Date对象来获取当前日期,然后根据公历和农历的转换算法计算出对应的农历日期。此外,为了实现节假日和节气的显示,开发者可能还需要维护一个包含这些特殊日期的数据库或数组...
为了进一步学习和理解这个小程序,你需要解压文件并查看其内容,包括可能的.pas文件(Delphi的源代码文件)、头文件(定义DLL导出的函数)和XML示例文件。 总结来说,这个"delphi2009解析xml dll小程序"涵盖了...
首先,我们需要理解基本的HTML结构,通常三级下拉菜单由`<ul>`和`<li>`元素构建,每个级别用嵌套的`<ul>`表示。CSS用于样式化菜单,使其具有吸引人的视觉效果。然而,为了让菜单具有交互性,我们需要引入JavaScript...
可能包含了从XML文件读取数据,调用上述的解析和映射技术,以及显示或验证查询结果的代码。 总结来说,Java号码归属地查询涉及了网络请求、XML解析、数据绑定和实体类的设计。通过理解这些技术,开发者可以构建出...
"SpringMVC纯注解配置"是SpringMVC框架的一种高级用法,旨在减少XML配置文件的使用,提高开发效率和代码可读性。在这个主题中,我们将深入探讨如何利用注解实现SpringMVC的配置以及jQuery如何处理后台返回的JSON对象...
我们可以创建一个`Workbook`对象来读取Excel文件,然后遍历工作表(`Sheet`)和单元格(`Cell`),将数据存储到数组中: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel....