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