效果图如下:

 

代码如下

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.Data.OracleClient; using System.Xml; namespace xmlOperating { public partial class Form1 : Form { OracleConnection conn = new OracleConnection("Data Source=192.168.**.***/hitachi;Persist Security Info=True;User ID=xxx;Password=xxx"); OracleCommand com; DataSet ds; XmlDocument xmlDoc = new XmlDocument(); XmlTextWriter xmlWriter; string path = ""; public Form1() { InitializeComponent(); } //数据库初始化 private void button1_Click(object sender, EventArgs e) { com = new OracleCommand("select * from testxmlbyxia", conn); OracleDataAdapter da = new OracleDataAdapter(com); ds = new DataSet(); da.Fill(ds); BuildTree(treeView1, ds); } //xml初始化 private void button2_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { textBox1.Text = openFileDialog1.FileName; path = openFileDialog1.FileName; XmlToTree(treeView1, path); } } //写xml private void button3_Click(object sender, EventArgs e) { FolderBrowserDialog dirPath = new FolderBrowserDialog(); if (dirPath.ShowDialog() == DialogResult.OK) { path = dirPath.SelectedPath+"\\"+textBox2.Text ; TreeToXml(treeView1, path); } } //清空 private void button4_Click(object sender, EventArgs e) { treeView1.Nodes.Clear(); } #region "XmlToTree" public void XmlToTree(TreeView tv, string path) { tv.Nodes.Clear(); xmlDoc.Load(path); XmlNode root = xmlDoc.SelectSingleNode("中国"); foreach (XmlNode node in root.ChildNodes) { TreeNode subTreeNode = new TreeNode(node.Name); treeView1.Nodes.Add(subTreeNode); TransXmlToTree(node.ChildNodes, subTreeNode); } } private void TransXmlToTree(XmlNodeList xmlNodes, TreeNode treeNode) { foreach (XmlNode xmlNode in xmlNodes) { TreeNode subTreeNode = new TreeNode(xmlNode.Name); treeNode.Nodes.Add(subTreeNode); if (xmlNode.ChildNodes.Count > 0) TransXmlToTree(xmlNode.ChildNodes, subTreeNode); } } #endregion #region "TreeToXml" public void TreeToXml(TreeView tv, string path) { xmlWriter = new XmlTextWriter(path, null); xmlWriter.WriteStartDocument(); xmlWriter.WriteComment("XML FROM A TREE");//创建文档注释 xmlWriter.WriteStartElement("中国");//创建根元素 xmlWriter.WriteEndElement(); xmlWriter.WriteEndDocument(); xmlWriter.Close(); xmlDoc.Load(path);//加载xml TransTreeToXml(tv.Nodes, (XmlElement)xmlDoc.SelectSingleNode("中国")); MessageBox.Show("xml文件创建成功,地址为:" + path); } private void TransTreeToXml(TreeNodeCollection nodes, XmlElement xmlNode) { foreach (TreeNode node in nodes) { XmlElement xmlnode = xmlDoc.CreateElement(node.Text); xmlNode.AppendChild(xmlnode);//追加子节点 if (node.Nodes.Count > 0)//还存在子节点 TransTreeToXml(node.Nodes, xmlnode); } xmlDoc.Save(path);//保存xml文档 } #endregion #region "数据库初始化" public void BuildTree(TreeView tv, DataSet ds) { //为表添加关系 ds.Relations.Add("NodeRelation", ds.Tables[0].Columns["id"], ds.Tables[0].Columns["parentid"]); foreach (DataRow dbRow in ds.Tables[0].Rows) { //树的根节点下面的一级节点 if (long.Parse(dbRow["ParentID"].ToString()) == 0 && long.Parse(dbRow["id"].ToString()) != 0) { TreeNode newNode = new TreeNode(dbRow["Context"].ToString()); tv.Nodes.Add(newNode); PopulateSubTree(dbRow, newNode); } } } //递归创建子树 private void PopulateSubTree(DataRow dbRow, TreeNode node) { foreach (DataRow childRow in dbRow.GetChildRows("NodeRelation")) { TreeNode childNode = new TreeNode(childRow["Context"].ToString()); node.Nodes.Add(childNode); PopulateSubTree(childRow, childNode); } } #endregion private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { MessageBox.Show(e.Node.Text); } } }