After loading elements and attributes of the below xml file in to a treeview, the nodes are edited and the treeview is saved back in to the same xml file. All elements and attributes need to be saved. However the attributes of only nested elements disappear during saving. After saving, all attribures of elements d & e are lost! This is because i am unable to retrieve the attribute values stored in to the tag property in addTreeNode function.(please see inline comments) Does anyone know of an easier or cleaner way to achieve this? Providing code snippets would be helpfull.
XML structure:
<?xml version="1.0" encoding="utf-8"?>
<root>
<a axa="1" axb="2" axc="3">content_of_tag _a</a>
<b bxa="10" bxb="20" bxc="30">content_of_tag_b</b>
<c cxa="11" cxb="21" cxc="31">
content_of_tag_c
<d dxa="101" dxb="201" dxc="301">
content_of_tag_d
<e exa="110" exb="210" exc="310">
content_of_tag_e
</e>
</d>
</c>
</root>
C# code:
private void Xml2TreeNode(XElement xNode, TreeNode treeNode)
{
if (xNode.HasElements) //if node has children
{
TreeNode tNode = null;
int i = 0;
foreach (XElement subNode in xNode.Elements())
{
if (subNode.Descendants().Count() > 0)
{
TreeNode tn = treeNode.Nodes.Add(subNode.Name.ToString().Trim());
tn.Nodes.Add(new TreeNode(subNode.FirstNode.ToString().Trim()));
treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //-------->this attribure values are NOT retrievable in saveNodes function!
tNode = tn; //add child nodes
}
else
{
TreeNode tn = treeNode.Nodes.Add(subNode.Name.ToString().Trim()); //show name of a leaf node element
tn.Nodes.Add(new TreeNode(subNode.Value.ToString().Trim())); //show value of above element as a child of its name
treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //---->these values are retrivable in saveNodes function
tNode = treeNode.Nodes[i++]; //add sibling node
}
addTreeNode(subNode, tNode); //recursively add child nodes
}
}
}
private void TreeNode2Xml(TreeNodeCollection tnc)
{
foreach (TreeNode node in tnc)
{
if (node.Nodes.Count > 0)
{
xr.WriteStartElement(node.Text);
if (node.Tag != null) //attribures retrieved here
{
List<XAttribute> attributeList = node.Tag as List<XAttribute>;
foreach (XAttribute attribute in attributeList)
{
xr.WriteAttributeString(attribute.Name.ToString(), attribute.Value.ToString());
}
}
saveNodes(node.Nodes);
xr.WriteEndElement();
}
else //No child nodes, so we just write the text
{
xr.WriteString(node.Text);
}
}
}
xr = new XmlTextWriter(filename, System.Text.Encoding.UTF8); //System.Text.Encoding.UTF8
xr.Formatting = Formatting.Indented;
xr.WriteStartDocument();
//Write our root node
xr.WriteStartElement(treeView1.Nodes[0].Text);
foreach (TreeNode node in tv.Nodes)
{
**TreeNode2Xml(node.Nodes);**
}
//Close the root node
xr.WriteEndElement();
xr.Close();
xDoc = XDocument.Load(dlg.FileName);
treeView1.Nodes.Clear();
treeView1.Nodes.Add(new TreeNode(xDoc.Document.Root.Name.ToString().Trim()));
TreeNode tNode = new TreeNode();
tNode = (TreeNode)treeView1.Nodes[0];
**Xml2TreeNode(xDoc.Root, tNode);**
treeView1.ExpandAll();
Exelent post of load and saving of data of treeview Example Load/Save XML-Treeview
Save Data Code:
Load Data
I am answering my own question; it may help someone in future.
Solved the issue by making small changes in Xml2TreeNode() function