实现功能有
1.根据Xml生成TreeView
2.双击修改节点
3.右键添加子节点或添加要节点
4.右键删除当前选择的节点
5.将修改后的TreeView重新生成Xml文档

其实这个主要是实现 了Xml生成TreeView,然后再根据TreeView生成Xml的过程
对我们操作这方面实现有很大的帮助
下面一起来看看我的界面吧

 
下面咱们一步一步来实现一下吧,
先来看看我的Xml文档结构

<?xml version="1.0" encoding="UTF-8"?>
<Tree>
<Node Name="" Text="去查网" >
<Node Name="" Text="技术部" ></Node>
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="cckan" >
<Node Name="" Text="开发部" ></Node>
</Node>
<Node Name="" Text="51.la" >
<Node Name="" Text="销售部fdf" >
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" >
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点fdf" ></Node>
<Node Name="" Text="新建子节点fdfd" ></Node>
</Node>
</Node>
<Node Name="" Text="操作部fdf" >
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="客服部fdf" ></Node>
<Node Name="" Text="财务部" ></Node>
</Node>
<Node Name="" Text="新建根节点" >
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" ></Node>
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="新建根节点" >
<Node Name="" Text="新建子节点" ></Node>
</Node>
<Node Name="" Text="新建根节点" ></Node>
</Tree>

很简单吧,
下面来看看是怎么生成TreeView的

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 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文档了
一起来看看代码吧

//保存
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 > )
{
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;
}

好了全部代码贴一下大家看看吧

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 > )
{
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的实现方式如下

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)
);
}

C#TreeView读取Xml,TreeView导出到Xml的更多相关文章

  1. 项目笔记:导出XML和导出全部XML功能

    前台代码: //导出一条Xml function btn_createXml(){ var title =$("#editButton").attr("title&quo ...

  2. C#基础精华06(Linq To XML,读取xml文件,写入xml)

    1.XML概述: 可扩展标记语言XML(eXtensible Markup Language)是一种简单灵活的文本格式的可扩展标记语言,侧重于存储数据. 2.XML特点 xml 标记语言 html x ...

  3. 在SQL Server中将数据导出为XML和Json

        有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...

  4. 做参数可以读取参数 保存参数 用xml文件的方式

    做参数可以读取参数 保存参数 用xml文件的方式 好处:供不同用户保存适合自己使用的参数

  5. ADO.NET笔记(一)XML导入导出和数据库

    数据导出成XML文件 #region 数据导出成XML文件 string sql = "select Id, CallerNumber, TelNum, StartDateTime, End ...

  6. java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .

    背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...

  7. [SQLXML]FOR XML语法导出XML的易错之处

    原文:[SQLXML]FOR XML语法导出XML的易错之处 [SQLXML]FOR XML语法导出XML的易错之处 Version Date Creator Description 1.0.0.1 ...

  8. C#使用Linq To XML读取XML,Linq生成XML,Linq创建带属性或带节点XML

    using System; using System.Linq; using System.Xml.Linq; namespace Sample2 { class Program { static v ...

  9. 创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候 不需要创建新的doc对象

    创建一个doc对象时候 如果读取了一个已存在的xml对象时候 该xml对象的结构已存在doc中 当改变该doc结构时候不 需要创建新的doc对象 直接添加即可 他会同步过去

随机推荐

  1. json数据格式及json格式化工具推荐

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据. 易于人阅读和编写,同时也易于机器解析和生成. XML也 ...

  2. 通过uboot传参设置mtd分区流程源码分析

    因为公司同事反映他使用的开板无法将根目录下的ip_work目mounth成功,由于本人当时没有去现场查看问题,只是象征性的询问内核是否创建了/dev/mtdblock5设备节点,因为该开发板默认是挂载 ...

  3. 版本控制之GitHub — — 第一步的理解

    GitHub是时下最流行的版本控制的一门“技术”,此之前svn(subversion)也是同样的作用. 至于版本控制:Git是分布式的,而svn是中心式的(或者叫集中式的)版本控制系统,这是两者之间理 ...

  4. Alarm机制用于定时服务

    获取一个 AlarmManager 的实例: AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE) ...

  5. Android事件分发机制浅析(3)

    本文来自网易云社区 作者:孙有军 我们只看最重要的部分 1: 事件为ACTION_DOWN时,执行了cancelAndClearTouchTargets函数,该函数主要清除上一次点击传递的路径,之后执 ...

  6. IOS开发---菜鸟学习之路--(二十三)-直接利用键值对的方式来处理数据的感想

    首先声明,本文纯粹只是做为本人个人新手的理解.文中的想法我知道肯定有很多地方是错的. 但是这就是我作为一个新人的使用方法,对于大牛非常欢迎指导,对于喷子请绕道而行. 由于这是早上跟我学长讨论数据处理时 ...

  7. xss games20关小游戏附源代码

    1. get方式的的值直接输出来了. ?name=<script>alert(1)</script> 2. 同样没有过滤,不过需要闭合前边的双引号和>. "&g ...

  8. Jmeter-深入理解cookie,session,token

    1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应,  尤其是我不用记住是谁 ...

  9. PAT——乙级1012

    1012 数字分类 (20 point(s)) 给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后 ...

  10. 【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)

    http://blog.csdn.net/pleasecallmewhy/article/details/8543181 在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储 ...