http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 73168|回复: 33
打印 上一主题 下一主题

[Winform] C#TreeView读取Xml,TreeView导出到Xml(附实现源码)

[复制链接]
跳转到指定楼层
楼主
发表于 2013-1-31 14:54:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
     C#TreeView读取Xml,TreeView导出到Xml
     这是昨天帮同事做的一个小例子,具体用来做什么我就不管了
实现功能有
1.根据Xml生成TreeView
2.双击修改节点
3.右键添加子节点或添加要节点
4.右键删除当前选择的节点
5.将修改后的TreeView重新生成Xml文档

源码下载 TreeLoadXml.rar (24.14 KB, 下载次数: 1516) 只有注册会员可以下载
其实这个主要是实现 了Xml生成TreeView,然后再根据TreeView生成Xml的过程
对我们操作这方面实现有很大的帮助
下面一起来看看我的界面吧

下面咱们一步一步来实现一下吧,
先来看看我的Xml文档结构
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Tree>
  3.   <Node Name="1" Text="去查网" >
  4.     <Node Name="2" Text="技术部" ></Node>
  5.     <Node Name="" Text="新建子节点" ></Node>
  6.   </Node>
  7.   <Node Name="3" Text="cckan" >
  8.     <Node Name="4" Text="开发部" ></Node>
  9.   </Node>
  10.   <Node Name="5" Text="51.la" >
  11.     <Node Name="7" Text="销售部fdf" >
  12.       <Node Name="" Text="新建子节点" ></Node>
  13.       <Node Name="" Text="新建子节点" >
  14.         <Node Name="" Text="新建子节点" ></Node>
  15.         <Node Name="" Text="新建子节点fdf" ></Node>
  16.         <Node Name="" Text="新建子节点fdfd" ></Node>
  17.       </Node>
  18.     </Node>
  19.     <Node Name="8" Text="操作部fdf" >
  20.       <Node Name="" Text="新建子节点" ></Node>
  21.     </Node>
  22.     <Node Name="9" Text="客服部fdf" ></Node>
  23.     <Node Name="10" Text="财务部" ></Node>
  24.   </Node>
  25.   <Node Name="" Text="新建根节点" >
  26.     <Node Name="" Text="新建子节点" ></Node>
  27.     <Node Name="" Text="新建子节点" ></Node>
  28.     <Node Name="" Text="新建子节点" ></Node>
  29.     <Node Name="" Text="新建子节点" ></Node>
  30.   </Node>
  31.   <Node Name="" Text="新建根节点" >
  32.     <Node Name="" Text="新建子节点" ></Node>
  33.   </Node>
  34.   <Node Name="" Text="新建根节点" ></Node>
  35. </Tree>
复制代码
很简单吧,
下面来看看是怎么生成TreeView的
[C#] 纯文本查看 复制代码
 XmlDocument doc = new XmlDocument();
        StringBuilder sb = new StringBuilder();
        //XML每行的内容
        private string xmlLine = "";
        //加载
        private void Form1_Load(object sender, EventArgs e)
        {
            doc.Load("TreeXml.xml"); //我是把xml放到debug里面了.你的路径就随便啦.不过这样方便一些.
            RecursionTreeControl(doc.DocumentElement, treeView1.Nodes);//将加载完成的XML文件显示在TreeView控件中
            treeView1.ExpandAll();//展开TreeView控件中的所有项
        }
        /// <summary>
        /// RecursionTreeControl:表示将XML文件的内容显示在TreeView控件中
        /// </summary>
        /// <param name="xmlNode">将要加载的XML文件中的节点元素</param>
        /// <param name="nodes">将要加载的XML文件中的节点集合</param>
        private void RecursionTreeControl(XmlNode xmlNode, TreeNodeCollection nodes)
        {
            foreach (XmlNode node in xmlNode.ChildNodes)//循环遍历当前元素的子元素集合
            {
                TreeNode new_child = new TreeNode();//定义一个TreeNode节点对象
                new_child.Name = node.Attributes["Name"].Value;
                new_child.Text = node.Attributes["Text"].Value;
                nodes.Add(new_child);//向当前TreeNodeCollection集合中添加当前节点
                RecursionTreeControl(node, new_child.Nodes);//调用本方法进行递归
            }
        }

用的是一个递归的方式生成的,
大家看看就明白了
下面是删除,修改和添加节点的代码
[C#] 纯文本查看 复制代码
//双击时修改
        private void treeView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point ClickPoint = new Point(e.X, e.Y);
                TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
                if (CurrentNode != null)//判断你点的是不是一个节点
                {
                    treeView1.SelectedNode = CurrentNode;//选中这个节点
                    treeView1.LabelEdit = true;
                    treeView1.SelectedNode.BeginEdit();
                }
            }
        }
//添加节点
        private void addTreeNode_Click(object sender, EventArgs e)
        {
            try
            {
                treeView1.SelectedNode.Nodes.Add("新建子节点");
                toolStripStatusLabel1.Text = "新建子节点";
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
            }
        }
        //删除节点
        private void deleteTreeNode_Click(object sender, EventArgs e)
        {
            try
            {
                treeView1.SelectedNode.Remove();
            }
            catch (Exception ex)
            {

                toolStripStatusLabel1.Text = ex.Message;
            }
        }
        //新建根节点
        private void addRootTreeNode_Click(object sender, EventArgs e)
        {
            try
            {
                treeView1.Nodes.Add("新建根节点");
                toolStripStatusLabel1.Text = "新建根节点成功";
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
            }
        }

下面就是把修改和删除之后的TreeView重新保存成Xml文档了
一起来看看代码吧
[C#] 纯文本查看 复制代码
 //保存
        private void SaveXml_Click(object sender, EventArgs e)
        {
            try
            {

                //写文件头部内容
                //下面是生成RSS的OPML文件
                sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
                sb.Append("<Tree>");

                //遍历根节点
                foreach (TreeNode node in treeView1.Nodes)
                {
                    xmlLine = GetRSSText(node);
                    sb.Append(xmlLine);

                    //递归遍历节点
                    parseNode(node, sb);

                    sb.Append("</Node>");
                }
                sb.Append("</Tree>");

                StreamWriter sr = new StreamWriter("TreeXml.xml", false, System.Text.Encoding.UTF8);
                sr.Write(sb.ToString());
                sr.Close();
                toolStripStatusLabel1.Text = "保存成功";
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
            }
        }
//递归遍历节点内容,最关键的函数
        private void parseNode(TreeNode tn, StringBuilder sb)
        {
            IEnumerator ie = tn.Nodes.GetEnumerator();

            while (ie.MoveNext())
            {
                TreeNode ctn = (TreeNode)ie.Current;
                xmlLine = GetRSSText(ctn);
                sb.Append(xmlLine);
                //如果还有子节点则继续遍历
                if (ctn.Nodes.Count > 0)
                {
                    parseNode(ctn, sb);
                }
                sb.Append("</Node>");
            }
        }
        //成生RSS节点的XML文本行
        private string GetRSSText(TreeNode node)
        {
            //根据Node属性生成XML文本
            string rssText = "<Node Name=\"" + node.Name + "\" Text=\"" + node.Text + "\" >";

            return rssText;
        }

好了全部代码贴一下大家看看吧
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Collections;
using System.IO;

namespace TreeLoadXml
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        XmlDocument doc = new XmlDocument();
        StringBuilder sb = new StringBuilder();
        //XML每行的内容
        private string xmlLine = "";
        //加载
        private void Form1_Load(object sender, EventArgs e)
        {
            doc.Load("TreeXml.xml"); //我是把xml放到debug里面了.你的路径就随便啦.不过这样方便一些.
            RecursionTreeControl(doc.DocumentElement, treeView1.Nodes);//将加载完成的XML文件显示在TreeView控件中
            treeView1.ExpandAll();//展开TreeView控件中的所有项
        }
        /// <summary>
        /// RecursionTreeControl:表示将XML文件的内容显示在TreeView控件中
        /// </summary>
        /// <param name="xmlNode">将要加载的XML文件中的节点元素</param>
        /// <param name="nodes">将要加载的XML文件中的节点集合</param>
        private void RecursionTreeControl(XmlNode xmlNode, TreeNodeCollection nodes)
        {
            foreach (XmlNode node in xmlNode.ChildNodes)//循环遍历当前元素的子元素集合
            {
                TreeNode new_child = new TreeNode();//定义一个TreeNode节点对象
                new_child.Name = node.Attributes["Name"].Value;
                new_child.Text = node.Attributes["Text"].Value;
                nodes.Add(new_child);//向当前TreeNodeCollection集合中添加当前节点
                RecursionTreeControl(node, new_child.Nodes);//调用本方法进行递归
            }
        }
        //双击时修改
        private void treeView1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point ClickPoint = new Point(e.X, e.Y);
                TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
                if (CurrentNode != null)//判断你点的是不是一个节点
                {
                    treeView1.SelectedNode = CurrentNode;//选中这个节点
                    treeView1.LabelEdit = true;
                    treeView1.SelectedNode.BeginEdit();
                }
            }
        }

        //递归遍历节点内容,最关键的函数
        private void parseNode(TreeNode tn, StringBuilder sb)
        {
            IEnumerator ie = tn.Nodes.GetEnumerator();

            while (ie.MoveNext())
            {
                TreeNode ctn = (TreeNode)ie.Current;
                xmlLine = GetRSSText(ctn);
                sb.Append(xmlLine);
                //如果还有子节点则继续遍历
                if (ctn.Nodes.Count > 0)
                {
                    parseNode(ctn, sb);
                }
                sb.Append("</Node>");
            }


        }
        //成生RSS节点的XML文本行
        private string GetRSSText(TreeNode node)
        {
            //根据Node属性生成XML文本
            string rssText = "<Node Name=\"" + node.Name + "\" Text=\"" + node.Text + "\" >";

            return rssText;
        }

        //添加节点
        private void addTreeNode_Click(object sender, EventArgs e)
        {
            try
            {
                treeView1.SelectedNode.Nodes.Add("新建子节点");
                toolStripStatusLabel1.Text = "新建子节点";
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
            }
        }
        //删除节点
        private void deleteTreeNode_Click(object sender, EventArgs e)
        {
            try
            {
                treeView1.SelectedNode.Remove();
            }
            catch (Exception ex)
            {

                toolStripStatusLabel1.Text = ex.Message;
            }
        }

        private void addRootTreeNode_Click(object sender, EventArgs e)
        {
            try
            {
                treeView1.Nodes.Add("新建根节点");
                toolStripStatusLabel1.Text = "新建根节点成功";
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
            }
        }
        //保存
        private void SaveXml_Click(object sender, EventArgs e)
        {
            try
            {

                //写文件头部内容
                //下面是生成RSS的OPML文件
                sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
                sb.Append("<Tree>");

                //遍历根节点
                foreach (TreeNode node in treeView1.Nodes)
                {
                    xmlLine = GetRSSText(node);
                    sb.Append(xmlLine);

                    //递归遍历节点
                    parseNode(node, sb);

                    sb.Append("</Node>");
                }
                sb.Append("</Tree>");

                StreamWriter sr = new StreamWriter("TreeXml.xml", false, System.Text.Encoding.UTF8);
                sr.Write(sb.ToString());
                sr.Close();
                toolStripStatusLabel1.Text = "保存成功";
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
            }
        }
    }
}

对于生成树的部分其实还有一种Linq的实现方式如下
[C#] 纯文本查看 复制代码
private void SaveToXml()
        {
            XDeclaration dec = new XDeclaration("1.0", "utf-8", "yes");
            XDocument xml = new XDocument(dec);

            XElement root = new XElement("Tree");

            foreach (TreeNode node in treeView1.Nodes)
            {
                XElement e = CreateElements(node);
                root.Add(e);
            }
            xml.Add(root);
            xml.Save("TreeXml.xml");
        }

        private XElement CreateElements(TreeNode node)
        {
            XElement root = CreateElement(node);

            foreach (TreeNode n in node.Nodes)
            {
                XElement e = CreateElements(n);
                root.Add(e);
            }
            return root;
        }

        private XElement CreateElement(TreeNode node)
        {
            return new XElement("Node",
                new XAttribute("Name", node.Name),
                new XAttribute("Text", node.Text)
                );
        }

好了就这些了,大家给点建议吧。呵呵

本帖被以下淘专辑推荐:

  • · xml|主题: 1, 订阅: 0


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
沙发
发表于 2013-3-6 22:56:03 | 只看该作者
非常感谢,很详细。很强大
板凳
发表于 2013-3-7 18:01:54 | 只看该作者
下载了,看看~
地板
发表于 2013-6-21 11:20:53 | 只看该作者
正在做这个,谢谢
5
发表于 2013-9-29 12:02:12 | 只看该作者
正需要,谢谢楼主分享!!!!!万份感谢!
6
发表于 2013-10-15 15:50:31 | 只看该作者
受教了,学习中……
7
发表于 2013-12-3 13:51:58 | 只看该作者
真是难得给力的帖子啊,强烈支持楼主。
8
发表于 2014-1-24 22:46:28 | 只看该作者
受教了,学习中……
9
发表于 2014-3-24 19:15:44 | 只看该作者
膜拜中……
回复

使用道具 举报

10
发表于 2014-5-20 13:50:59 | 只看该作者
这么给力的东东,管理采集的文章有望了!
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 02:11

© 2014-2021

快速回复 返回顶部 返回列表