在我的一个项目中,需要保存一个这样的树结构:

恰好,这个项目的开发语言是C#,这时我就想到了XmlSerializer,从网上找了一些教程,

最后总算圆满完成任务:

   1: [XmlRoot("HotLines")]
   2: public class HotLines
   3: {
   4:     #region Constructor...
   5:     public HotLines()
   6:     {
   7:         Lines = new List<HotLine>();
   8:         LineGroups = new List<HotLines>();
   9:     }
  10:     #endregion
  11:  
  12:     #region Properties...
  13:     [XmlAttribute("Name")]
  14:     public string Name
  15:     {
  16:         get;
  17:         set;
  18:     }
  19:  
  20:     [XmlArray("Lines")]
  21:     [XmlArrayItem("Line", typeof(HotLine))]
  22:     public List<HotLine> Lines
  23:     {
  24:         get;
  25:         set;
  26:     }
  27:  
  28:     [XmlArray("LineGroups")]
  29:     [XmlArrayItem("Lines", typeof(HotLines))]
  30:     public List<HotLines> LineGroups
  31:     {
  32:         get;
  33:         set;
  34:     }
  35:     #endregion
  36:  
  37:     #region Utilities...
  38:     static public void SerializeToXML(HotLines lines, string fileName)
  39:     {
  40:         XmlSerializer serializer = new XmlSerializer(typeof(KingTools.HotLines));
  41:         TextWriter textWriter = new StreamWriter(fileName);
  42:         serializer.Serialize(textWriter, lines);
  43:         textWriter.Close();
  44:     }
  45:  
  46:     static public HotLines DeserializeFromXML(string fileName)
  47:     {
  48:         XmlSerializer deserializer = new XmlSerializer(typeof(KingTools.HotLines), new Type[] { typeof(HotLine) });
  49:         TextReader textReader = new StreamReader(fileName);
  50:         var lines = (HotLines)deserializer.Deserialize(textReader);
  51:         textReader.Close();
  52:         return lines;
  53:     }
  54:     #endregion
  55: }
  56:  
  57: [XmlRoot("Line")]
  58: public class HotLine
  59: {
  60:     #region Properties...
  61:     [XmlElement("File")]
  62:     public string File
  63:     {
  64:         get;
  65:         set;
  66:     }
  67:  
  68:     [XmlElement("Column")]
  69:     public int Column
  70:     {
  71:         get;
  72:         set;
  73:     }
  74:  
  75:     [XmlElement("Comment")]
  76:     public string Comment
  77:     {
  78:         get;
  79:         set;
  80:     }
  81:     #endregion
  82: }

看看最终的代码,不得不为C#开发效率的高效而折服。用C++保存这样的一份数据,想想都怕,不知道其中要出多少幺蛾子。

下面是一份测试代码:

   1: HotLines root = new HotLines();
   2: root.Name = "Root";
   3:  
   4: HotLine aLine = new HotLine();
   5: aLine.Column = 10;
   6: aLine.File = "Test";
   7:  
   8: root.Lines.Add(aLine);
   9:  
  10: HotLines group = new HotLines();
  11: group.Name = "group";
  12:  
  13: root.LineGroups.Add(group);
  14: group.Lines.Add(aLine);
  15:  
  16: string fileName = @"c:\lines.xml";
  17: HotLines.SerializeToXML(root, fileName);
  18:  
  19: var newRoot = HotLines.DeserializeFromXML(fileName);
  20:  
  21: Assert.AreEqual(newRoot.Name, root.Name);
  22: Assert.AreEqual(newRoot.Lines.Count, root.Lines.Count);
  23: Assert.AreEqual(newRoot.LineGroups.Count, root.LineGroups.Count);

测试代码生成的XML如下:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <HotLines xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Root">
   3:   <Lines>
   4:     <Line>
   5:       <File>Test</File>
   6:       <Column>10</Column>
   7:     </Line>
   8:   </Lines>
   9:   <LineGroups>
  10:     <Lines Name="group">
  11:       <Lines>
  12:         <Line>
  13:           <File>Test</File>
  14:           <Column>10</Column>
  15:         </Line>
  16:       </Lines>
  17:       <LineGroups />
  18:     </Lines>
  19:   </LineGroups>
  20: </HotLines>

代码说明一切,XmlSerializer 和 XML Attribute的便利不言自明。

转载于:https://www.cnblogs.com/jalenwang/archive/2011/07/28/save_tree_as_xml.html

Save a tree as XML using XmlSerializer相关推荐

  1. C# 派生类的XmlSerializer序列化XML

    近段对XML 序列化进行处理,用XmlSerializer这个挺好用的. 但是对于派生类对象的XML的生成总会报错.因为同一个节点名称,不能反射为不同的对象.这个在网上找了好久,都说要利用反射来处理. ...

  2. C# XML反序列化与序列化举例:XmlSerializer(转)

    1 using System; 2 using System.IO; 3 using System.Xml.Serialization; 4 5 namespace XStream 6 { 7 /// ...

  3. xml与java代码相互装换的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你 ...

  4. boost解析xml文件

    前面我们介绍了xml文件,今天我们试着用boost库来解析xml文件.我们将举两个例子来说明怎么使用. 来自boost官方的例子 先看xml文件的内容: <debug><filena ...

  5. 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...

    在大数据项目开发过程中,ETL(Extract-Transform-Load)是必不可少.即便目前 JSON 非常流行,开发人员也有必定会有对远古系统的挑战,而 XML 格式的数据源作为经典存在浑身上 ...

  6. C#实现TreeView向XML的绝对转换类

    从第一次接触XML开始就想写一个能实现tree和XML灵活转换的类了. 写这个类大概用去了将近半天的时间,花的时间有些长了.呵呵..好在收获颇多,熟练了XML的读写类,对C#中的foreach循环也有 ...

  7. python处理xml设置节点值_python:通过增加数字更改xml节点值

    使用lxml库非常容易实现 from lxml import objectify class Parser(object): def __init__(self, tree, counter_star ...

  8. C# XML序列化和反序列化

    原文:http://www.cnblogs.com/nhxy/archive/2010/11/16/1878409.html 本文描述如何使用CLR中的StringWriter,XmlSerializ ...

  9. [C#基础]c#中的XmlSerializer类

    原文链接:http://www.cnblogs.com/nhxy/archive/2010/11/16/1878409.html 何为序列化?何为反序列化?引用msdn上的一句话就是--XML 序列化 ...

最新文章

  1. 关于android工程添加support-v7包的问题
  2. 学习selenium所须要具备的技术
  3. DreamWeaver做ASP 第5页
  4. oracle怎么设置出蓝色边,Oracle 数据库入门之———————-,多行函数-蓝色留心...
  5. 17.立体匹配——介绍,匹配,寻找最佳匹配 Matlab实战_1
  6. 搜狗开源最新NLP研究成果,打造业内最全机器阅读理解工具包SMRC
  7. RHCS Oracle HA for OEL5.8 KVM实践配置
  8. java实现文件上传下载功能_java文件上传下载功能实现代码
  9. php读取mpp,php解析mpp文件中的前置任务
  10. 【Python入门练手小项目】画一个蓝胖子❤️
  11. 关于笔记本突然鼠标无法连接,电脑蓝牙消失的问题
  12. IObit Uninstaller Pro v10.6.0.4 Cracked 安装监视器无法开启或无效的解决方案
  13. 企业网站建设改版的未来方向
  14. 招银面经总结;面经转载,答案自写。
  15. 武汉新时标文化传媒有限公司新型网红经济爆发式增长
  16. icp算法原理与实现
  17. 合肥市第 34 届青少年信息学(计算机)奥林匹克竞赛小学组试题
  18. 局域网文件服务器的搭建
  19. 使用threejs实现地球辉光和大气层效果
  20. 小马哥---高仿苹果6 主板型号z13刷机拆机主板图 6572芯片nand字库

热门文章

  1. 如何使用VMware Converter进行P2V热迁移
  2. 新时代网管的十二大主要职责(一)
  3. linux将b1内容重定向到b3,linux
  4. hardmard积 用什么符号表示_简明算术教程——第四章 线性代数——第1节 矩阵环(二)...
  5. 微信攻城三国怎么找服务器,攻城三国怎么玩 新手FAQ常见问题答案汇总[图]
  6. linux nfs acl 特定ip,技术|RHCSA 系列(七): 使用 ACL(访问控制列表) 和挂载 Samba/NFS 共享...
  7. python删除过期文件_Python删除指定目录下的过期文件的代码
  8. Linux下rgmii接口,zynq7010 petalinux 2019.2 RGMII via EMIO 连接问题
  9. 白名单模板_亚马逊品牌备案常见问题—— 白名单、IP加速器及品牌备案后无法使用A+...
  10. 以太坊区块链_以太坊区块链搭建与使用(一)-私有链