c# treeview控件节点数据转为xml文档(借鉴了别人的想法)

giordano000 2014-07-07 02:47:54
首先是加载xml文件,生成treeview,实现之后,对树节点进行删除后,我要保存会xml文件,但是出现问题,希望帮忙看下
//保存

XmlTreeViewOperaCls xml = new XmlTreeViewOperaCls();
SaveFileDialog dlg=new SaveFileDialog();
xml.SaveTreeViewToXml(dlg,treeView1);
MessageBox.Show("TreeView保存成功!");

public class XmlTreeViewOperaCls
{
//定义字段
private string iNodeName = " ";
private string iNodeText = " ";
private string iNodeTag = " ";
//定义类属性
public string NodeName
{
get{return iNodeName;}
set { iNodeName = value;}
}
public string NodeText
{
get{return iNodeText; }
set{ iNodeText = value; }
}
public string NodeTag
{
get { return iNodeTag;}
set {iNodeTag = value;}
}
}

//将TreeView保存到XML文件中
public void SaveTreeViewToXml(SaveFileDialog saveXmlDlg, TreeView treeViewControl)
{
saveXmlDlg.DefaultExt = "xml";
saveXmlDlg.Filter = "XML Files (*.xml)|*.xml";
saveXmlDlg.FilterIndex = 1;
if (saveXmlDlg.ShowDialog() == DialogResult.OK)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml("<Configs></Configs>");
XmlNode root = doc.DocumentElement;
doc.InsertBefore(doc.CreateXmlDeclaration("1.0", "utf-8","yes"), root);
TreeNodeToXml(treeViewControl.TopNode.Nodes, root);
doc.Save(saveXmlDlg.FileName);
}
}
// 递归的方法读取TreeView控件所有节点并填入XML文件
public void TreeNodeToXml(TreeNodeCollection treeNodes, XmlNode xmlNode)
{
XmlDocument doc = xmlNode.OwnerDocument;
foreach (TreeNode treeNode in treeNodes)
{
//创建一个xml元素(element)
XmlNode element = doc.CreateNode("element", treeNode.Text.ToString(), "");
//创建一个属性Name
XmlAttribute attr = doc.CreateAttribute("Name");
//为属性赋值
attr.Value = treeNode.Text;
//为该元素添加属性
element.Attributes.Append(attr);
//添加元素
xmlNode.AppendChild(element);
if (treeNode.Nodes.Count > 0)
{
TreeNodeToXml(treeNode.Nodes, element);
}
}
}

正常xml文件存储格式
<?xml version="1.0" encoding="utf-8"?>
<Configs>
<Config StoreName="Tag1">
<StoreTime>123</StoreTime>
<StoreMaxCount>321</StoreMaxCount>
<StoreCondition>12</StoreCondition>
</Config>
<Config StoreName="Tag2">
<StoreTime>123</StoreTime>
<StoreMaxCount>321</StoreMaxCount>
<StoreCondition>12</StoreCondition>
</Config>
<Config StoreName="Tag3">
<StoreTime>123</StoreTime>
<StoreMaxCount>321</StoreMaxCount>
<StoreCondition>13</StoreCondition>
</Config>
<Config StoreName="Tag991">
<StoreTime>1212</StoreTime>
<StoreMaxCount>2121</StoreMaxCount>
<StoreCondition>22</StoreCondition>
</Config>
<Config StoreName="Tag100">
<StoreTime>666</StoreTime>
<StoreMaxCount>777</StoreMaxCount>
<StoreCondition>55</StoreCondition>
</Config>
</Configs>

删除节点后保存格式出错
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Configs>
<Tag1 Name="Tag1">
<StoreTime Name="StoreTime">
<999 Name="999" />
</StoreTime>
<StoreMaxCount Name="StoreMaxCount">
<888 Name="888" />
</StoreMaxCount>
<StoreCondition Name="StoreCondition">
<777 Name="777" />
</StoreCondition>
</Tag1>
<Tag2 Name="Tag2">
<StoreTime Name="StoreTime">
<123 Name="123" />
</StoreTime>
<StoreMaxCount Name="StoreMaxCount">
<321 Name="321" />
</StoreMaxCount>
<StoreCondition Name="StoreCondition">
<12 Name="12" />
</StoreCondition>
</Tag2>
<Tag3 Name="Tag3">
<StoreTime Name="StoreTime">
<123 Name="123" />
</StoreTime>
<StoreMaxCount Name="StoreMaxCount">
<321 Name="321" />
</StoreMaxCount>
<StoreCondition Name="StoreCondition">
<13 Name="13" />
</StoreCondition>
</Tag3>
<Tag991 Name="Tag991">
<StoreTime Name="StoreTime">
<1212 Name="1212" />
</StoreTime>
<StoreMaxCount Name="StoreMaxCount">
<2121 Name="2121" />
</StoreMaxCount>
<StoreCondition Name="StoreCondition">
<22 Name="22" />
</StoreCondition>
</Tag991>
<Tag100 Name="Tag100">
<StoreTime Name="StoreTime">
<666 Name="666" />
</StoreTime>
<StoreMaxCount Name="StoreMaxCount">
<777 Name="777" />
</StoreMaxCount>
<StoreCondition Name="StoreCondition">
<55 Name="55" />
</StoreCondition>
</Tag100>
</Configs>
...全文
368 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-07-09
  • 打赏
  • 举报
回复
引用 8 楼 rrxxjj1234 的回复:
应该会用到递归的概念吧
不用递归子节点层数就固定了
jjai_2662873533 2014-07-09
  • 打赏
  • 举报
回复
xml文件节点绑定到Treeview中 private XmlDocument NexusDocument = new XmlDataDocument();//定义一个XML文档对象 private void BindingXML_Load(object sender, EventArgs e) { string filePath = "NexusPoint.xml";//定义一个变量保存XML文件的路径 if(File.Exists(filePath))//当在指定路径下存在该文件时 { NexusDocument.Load(filePath);//加载该路径下的XML文件 RecursionTreeControl(NexusDocument.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)//循环遍历当前元素的子元素集合 { string temp = (node.Value != null ? node.Value : (node.Attributes != null && node.Attributes.Count > 0) ? node.Attributes[0].Value : node.Name);//表示TreeNode节点的文本内容 TreeNode new_child = new TreeNode(temp);//定义一个TreeNode节点对象 nodes.Add(new_child);//向当前TreeNodeCollection集合中添加当前节点 RecursionTreeControl(node,new_child.Nodes);//调用本方法进行递归 } }
giordano000 2014-07-08
  • 打赏
  • 举报
回复
怎么木有人呢,大神们,快来吧
giordano000 2014-07-08
  • 打赏
  • 举报
回复
引用 8 楼 rrxxjj1234 的回复:
应该会用到递归的概念吧
不是会,是一定用
leeya66 2014-07-08
  • 打赏
  • 举报
回复
应该会用到递归的概念吧
tinydyw 2014-07-08
  • 打赏
  • 举报
回复
dataset和datatable没有本质区别...只不过dataset是datatable的集合而已..
giordano000 2014-07-08
  • 打赏
  • 举报
回复
引用 5 楼 happy09li 的回复:
http://blog.csdn.net/happy09li/article/details/7460521
大神 能帮我解释下不 private void getXmlInfo() // { DataSet myds = new DataSet(); myds.ReadXml(strPath); dataGridView1.DataSource = myds.Tables[0]; } //这段代码是绑定到datagridview中 ,和DataTable操作区别是什么呢
giordano000 2014-07-08
  • 打赏
  • 举报
回复
引用 2 楼 happy09li 的回复:
会出什么错呢
我要是删除节点(tag1)就是要彻底删除,在树中节点tag1都删除了,包括元素的属性,只保存其余节点。第一张图是正确格式,第二张图格式就乱了。
giordano000 2014-07-08
  • 打赏
  • 举报
回复



上传图片了,大神,劳烦请教一下
熙风 2014-07-08
  • 打赏
  • 举报
回复
会出什么错呢

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧