@fzkim , Welcome to Microsoft Q&A, please refer to the following code example to save treeview xml in winform.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public string FileName { get; set; }
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Title = "Open XML Document";
dlg.Filter = "XML Files (*.xml)|*.xml";
if (dlg.ShowDialog() == DialogResult.OK)
{
try
{
FileName = dlg.FileName;
this.Cursor = Cursors.WaitCursor;
XmlDocument xDoc = new XmlDocument();
xDoc.Load(dlg.FileName);
treeView1.Nodes.Clear();
treeView1.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name));
TreeNode tNode = new TreeNode();
tNode = (TreeNode)treeView1.Nodes[0];
addTreeNode(xDoc.DocumentElement, tNode);
treeView1.ExpandAll();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
this.Cursor = Cursors.Default;
}
}
}
private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
{
XmlNode xNode;
TreeNode tNode;
XmlNodeList xNodeList;
if (xmlNode.HasChildNodes)
{
xNodeList = xmlNode.ChildNodes;
for (int x = 0; x <= xNodeList.Count - 1; x++)
{
xNode = xmlNode.ChildNodes[x];
string nodetext = xNode.Name;
Console.WriteLine(nodetext);
if (!nodetext.Contains("text"))
{
if (xNode.Attributes.Count > 0)
{
for (int i = 0; i < xNode.Attributes.Count; i++)
{
nodetext +=" "+xNode.Attributes[i].Name + "=" + "\"" + xNode.Attributes[i].Value+ "\"";
}
}
}
treeNode.Nodes.Add(new TreeNode(nodetext));
tNode = treeNode.Nodes[x];
addTreeNode(xNode, tNode);
}
}
else
{
string nodetext = xmlNode.Name + ": ";
Console.WriteLine(nodetext);
if (!nodetext.Contains("text"))
{
if (xmlNode.Attributes.Count > 0)
{
for (int i = 0; i < xmlNode.Attributes.Count; i++)
{
nodetext += xmlNode.Attributes[i].Name + "=" + xmlNode.Attributes[i].Value;
}
}
}
else
{
nodetext = xmlNode.InnerText;
}
treeNode.Text = nodetext;
}
}
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
treeView1.LabelEdit = true;
treeView1.SelectedNode.BeginEdit();
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.S))
{
exportToXml(treeView1, FileName);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
//保存
StreamWriter sr = null;
public void exportToXml(TreeView tv, string filename)
{
sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
sr.WriteLine("<" + tv.Nodes[0].Text + ">");
foreach (TreeNode node in tv.Nodes)
{
saveNode(node.Nodes);
}
//Close the root node
sr.WriteLine("</" + tv.Nodes[0].Text + ">");
sr.Close();
var lines = File.ReadAllLines(filename).Where(line => !String.IsNullOrWhiteSpace(line));
File.WriteAllLines(filename, lines);
}
private void saveNode(TreeNodeCollection tnc)
{
foreach (TreeNode node in tnc)
{
if (node.Nodes.Count > 0)
{
if(node.Text.Contains("="))
{
sr.Write("<" + node.Text + ">");
saveNode(node.Nodes);
sr.WriteLine("</" + node.Text.Split(' ')[0] + ">");
}
else
{
sr.WriteLine("");
sr.Write("<" + node.Text + ">");
saveNode(node.Nodes);
sr.WriteLine("</" + node.Text + ">");
}
}
else
sr.Write(node.Text);
}
}
}
Tested result:
Note: After you editing the node, you could press ctrl+s
to save it to xml file.
Best Regards,
Jack
If the answer is the right solution, please click "Accept Answer" and upvote it.If you have extra questions about this answer, please click "Comment".
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.