How to serialize TreeView in to xml and deserialize xml back to TreeView?

后端 未结 2 1163
刺人心
刺人心 2020-12-19 16:14

\"Tree

After loading elements and attributes of the below xml file in to a treeview, th

相关标签:
2条回答
  • 2020-12-19 16:35

    Exelent post of load and saving of data of treeview Example Load/Save XML-Treeview

    Save Data Code:

    //We use this in the export and the saveNode 
    //functions, though it's only instantiated once.
    private StreamWriter sr;
    
    public void exportToXml(TreeView tv, string filename) 
    {
        sr = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
        //Write the header
        sr.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
        //Write our root node
        sr.WriteLine("<" + treeView1.Nodes[0].Text + ">");
        foreach (TreeNode node in tv.Nodes)
        {
            saveNode(node.Nodes);
        }
        //Close the root node
        sr.WriteLine("</" + treeView1.Nodes[0].Text + ">");
        sr.Close();
    }
    
    private void saveNode(TreeNodeCollection tnc)
    {
        foreach (TreeNode node in tnc)
        {
            //If we have child nodes, we'll write 
            //a parent node, then iterrate through
            //the children
            if (node.Nodes.Count > 0)
            {
                sr.WriteLine("<" + node.Text + ">");
                saveNode(node.Nodes);
                sr.WriteLine("</" + node.Text + ">");
            } 
            else //No child nodes, so we just write the text
                sr.WriteLine(node.Text);
        }
    }
    

    Load Data

    //Open the XML file, and start to populate the treeview
    private void populateTreeview()
    {
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Title = "Open XML Document";
        dlg.Filter = "XML Files (*.xml)|*.xml";
        dlg.FileName = Application.StartupPath + "\\..\\..\\example.xml";
        if (dlg.ShowDialog() == DialogResult.OK)
        {
            try
            {
                //Just a good practice -- change the cursor to a 
                //wait cursor while the nodes populate
                this.Cursor = Cursors.WaitCursor;
                //First, we'll load the Xml document
                XmlDocument xDoc = new XmlDocument();
                xDoc.Load(dlg.FileName);        
                //Now, clear out the treeview, 
                //and add the first (root) node
                treeView1.Nodes.Clear();
                treeView1.Nodes.Add(new 
                  TreeNode(xDoc.DocumentElement.Name));
                TreeNode tNode = new TreeNode();
                tNode = (TreeNode)treeView1.Nodes[0];
                //We make a call to addTreeNode, 
                //where we'll add all of our nodes
                addTreeNode(xDoc.DocumentElement, tNode);
                //Expand the treeview to show all nodes
                treeView1.ExpandAll();    
            }
            catch(XmlException xExc) 
              //Exception is thrown is there is an error in the Xml
            {
                MessageBox.Show(xExc.Message);
            }
            catch(Exception ex) //General exception
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                this.Cursor = Cursors.Default; //Change the cursor back
            }
        }
    }
    //This function is called recursively until all nodes are loaded
    private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
    {
        XmlNode xNode;
        TreeNode tNode;
        XmlNodeList xNodeList;
        if (xmlNode.HasChildNodes) //The current node has children
        {
            xNodeList = xmlNode.ChildNodes;
            for(int x=0; x<=xNodeList.Count-1; x++) 
              //Loop through the child nodes
            {
                xNode = xmlNode.ChildNodes[x];
                treeNode.Nodes.Add(new TreeNode(xNode.Name));
                tNode = treeNode.Nodes[x];
                addTreeNode(xNode, tNode);
            }
        }
        else //No children, so add the outer xml (trimming off whitespace)
            treeNode.Text = xmlNode.OuterXml.Trim();
    }
    
    0 讨论(0)
  • 2020-12-19 16:50

    Fixed the issue by making small changes in Xml2TreeNode() function

    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)
                {//handle non-leaf node
                    TreeNode tn = treeNode.Nodes.Add(subNode.Name.ToString().Trim());
                    tn.Nodes.Add(new TreeNode(subNode.FirstNode.ToString().Trim()));
                    tn.Tag = treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //---->these values are retrived in SaveNodes function
                    tNode = tn; //add child nodes
                }
                else
                {//handle leaf node
                    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
                    tn.Tag = treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //---->these values are retrived in SaveNodes function
                    tNode = treeNode.Nodes[i++]; //add sibling node
                }
    
                Xml2TreeNode(subNode, tNode); //recursively add child nodes
            }
        }
    }  
    
    
    
    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)
                {//handle non-leaf node
                    TreeNode tn = treeNode.Nodes.Add(subNode.Name.ToString().Trim());
                    ////tn.Nodes.Add(new TreeNode(subNode.FirstNode.ToString().Trim())); //adds extra element-value to node
                    tn.Tag = treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //---->these values are retrived in TreeNode2Xml function
                    tNode = tn; //add child nodes
                }
                else
                {//handle leaf node
                    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
                    tn.Tag = treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //---->these values are retrived in TreeNode2Xml function
                    tNode = treeNode.Nodes[i++]; //add sibling node
                }
    
                Xml2TreeNode(subNode, tNode); //recursively add child nodes
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题