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

来源:互联网 发布:培训机构垃圾 知乎 编辑:程序博客网 时间:2024/06/09 14:01

从第一次接触XML开始就想写一个能实现tree和XML灵活转换的类了。

写这个类大概用去了将近半天的时间,花的时间有些长了。呵呵。。好在收获颇多,熟练了XML的读写类,对C#中的foreach循环也有了更深的认识。

[c-sharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Windows.Forms;  
  5. using System.Xml;  
  6.   
  7.   
  8. namespace TreeExXML  
  9. {  
  10.     class TreeExXMLCls  
  11.     {  
  12.         private TreeView thetreeview;  
  13.         private string xmlfilepath;  
  14.         XmlTextWriter textWriter;  
  15.         XmlNode Xmlroot;  
  16.         XmlDocument textdoc;  
  17.   
  18.         public TreeExXMLCls()  
  19.         {  
  20.             //----构造函数   
  21.             textdoc = new XmlDocument();  
  22.   
  23.         }  
  24.   
  25.         ~TreeExXMLCls()  
  26.         {  
  27.             //----析构函数   
  28.         }  
  29.  
  30.         #region 遍历treeview并实现向XML的转化   
  31.         /// <summary>      
  32.         /// 遍历treeview并实现向XML的转化   
  33.         /// </summary>      
  34.         /// <param name="TheTreeView">树控件对象</param>     
  35.         /// <param name="XMLFilePath">XML输出路径</param>     
  36.         /// <returns>0表示函数顺利执行</returns>     
  37.   
  38.         public int TreeToXML(TreeView TheTreeView, string XMLFilePath)  
  39.         {  
  40.             //-------初始化转换环境变量   
  41.             thetreeview = TheTreeView;  
  42.             xmlfilepath = XMLFilePath;  
  43.             textWriter = new XmlTextWriter(xmlfilepath, null);  
  44.   
  45.             //-------创建XML写操作对象  
  46.             textWriter.Formatting = Formatting.Indented;  
  47.   
  48.             //-------开始写过程,调用WriteStartDocument方法  
  49.             textWriter.WriteStartDocument();  
  50.   
  51.             //-------写入说明   
  52.             textWriter.WriteComment("this XML is created from a tree");  
  53.             textWriter.WriteComment("By 思月行云");  
  54.   
  55.             //-------添加第一个根节点   
  56.             textWriter.WriteStartElement("TreeExXMLCls");  
  57.             textWriter.WriteEndElement();  
  58.   
  59.             //------ 写文档结束,调用WriteEndDocument方法  
  60.             textWriter.WriteEndDocument();  
  61.   
  62.             //-----关闭输入流   
  63.             textWriter.Close();  
  64.   
  65.             //-------创建XMLDocument对象  
  66.             textdoc.Load(xmlfilepath);  
  67.   
  68.             //------选中根节点   
  69.             XmlElement Xmlnode=textdoc.CreateElement(thetreeview.Nodes[0].Text);  
  70.             Xmlroot = textdoc.SelectSingleNode("TreeExXMLCls");  
  71.   
  72.             //------遍历原treeview控件,并生成相应的XML  
  73.             TransTreeSav(thetreeview.Nodes, (XmlElement)Xmlroot);  
  74.             return 0;  
  75.         }  
  76.   
  77.         private int TransTreeSav(TreeNodeCollection nodes, XmlElement ParXmlnode)   
  78.         {  
  79.   
  80.             //-------遍历树的各个故障节点,同时添加节点至XML  
  81.             XmlElement xmlnode;  
  82.             Xmlroot = textdoc.SelectSingleNode("TreeExXMLCls");  
  83.   
  84.             foreach (TreeNode node in nodes)  
  85.             {  
  86.                 xmlnode = textdoc.CreateElement(node.Text);  
  87.                 ParXmlnode.AppendChild(xmlnode);  
  88.   
  89.                 if (node.Nodes.Count > 0)  
  90.                 {  
  91.                     TransTreeSav(node.Nodes, xmlnode);  
  92.                 }  
  93.             }  
  94.             textdoc.Save(xmlfilepath);  
  95.             return 0;  
  96.         }  
  97.  
  98.         #endregion  
  99.  
  100.         #region 遍历XML并实现向tree的转化   
  101.         /// <summary>      
  102.         /// 遍历treeview并实现向XML的转化   
  103.         /// </summary>      
  104.         /// <param name="XMLFilePath">XML输出路径</param>     
  105.         /// <param name="TheTreeView">树控件对象</param>     
  106.         /// <returns>0表示函数顺利执行</returns>     
  107.   
  108.         public int XMLToTree(string XMLFilePath,TreeView TheTreeView)  
  109.         {  
  110.             //-------重新初始化转换环境变量   
  111.             thetreeview = TheTreeView;  
  112.             xmlfilepath = XMLFilePath;  
  113.   
  114.             //-------重新对XMLDocument对象赋值   
  115.             textdoc.Load(xmlfilepath);  
  116.   
  117.             XmlNode root = textdoc.SelectSingleNode("TreeExXMLCls");  
  118.               
  119.             foreach (XmlNode subXmlnod in root.ChildNodes)  
  120.             {  
  121.                 TreeNode trerotnod = new TreeNode();  
  122.                 trerotnod.Text = subXmlnod.Name;  
  123.                 thetreeview.Nodes.Add(trerotnod);  
  124.                 TransXML(subXmlnod.ChildNodes, trerotnod);  
  125.    
  126.             }  
  127.             return 0;  
  128.         }  
  129.   
  130.         private int TransXML(XmlNodeList Xmlnodes,TreeNode partrenod)  
  131.         {  
  132.             //------遍历XML中的所有节点,仿照treeview节点遍历函数  
  133.             foreach (XmlNode xmlnod in Xmlnodes)  
  134.             {  
  135.                 TreeNode subtrnod = new TreeNode();  
  136.                 subtrnod.Text = xmlnod.Name;  
  137.                 partrenod.Nodes.Add(subtrnod);  
  138.   
  139.                 if (xmlnod.ChildNodes.Count > 0)  
  140.                 {  
  141.                     TransXML(xmlnod.ChildNodes, subtrnod);  
  142.                 }  
  143.             }  
  144.             return 0;  
  145.         }  
  146.         #endregion   
  147.     }  
  148. }  
直接调用相关方法,即可实现Treeview与xml间的相互转换,方便快捷~
除此之外,我们还可以在现有基础上对这个类进行扩展。比方说,我们可以使用Xml中的属性(Attribute)存储所有Treenode的Tag内容。
Xml中属性的使用相对简单:
使用XmlElement.SetAttribute(string name,string value)既可以新增属性,也可以针对旧有属性更改其值。
使用string XmlElement.GetAttribute(string name)可以方便的获得已有属性的值。
以下提供源代码文件下载
0 0