代码之家  ›  专栏  ›  技术社区  ›  yigit sertac

treeview节点的XML表示

  •  1
  • yigit sertac  · 技术社区  · 8 年前

    我正在尝试从XML文件导入和导出到treeview。但我有这个问题。 sample treeview 具有同一父节点的一个根节点和两个子节点。我用于导出和导入的代码不起作用。导出treeview时,保存的XML文件如下所示:

    <?xml version="1.0" encoding="utf-8" ?>
    <AAA>
    BBBCCC</AAA>
    

    当我将xml文件导入到treeview时,它如下所示 after import xml to treeview . 我用于导出和导入的代码是:

    //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();
    }
    
    private XmlTextWriter xr;
    
    public void exportToXml2(TreeView tv, string filename) 
    {
        xr = new XmlTextWriter(filename, System.Text.Encoding.UTF8);
        xr.WriteStartDocument();
        //Write our root node
        xr.WriteStartElement(treeView1.Nodes[0].Text);
    
        foreach (TreeNode node in tv.Nodes)
        {
            saveNode2(node.Nodes);
        }
    
        //Close the root node
        xr.WriteEndElement();
        xr.Close();
    }
    
    private void saveNode2(TreeNodeCollection tnc)
    {
        foreach (TreeNode node in tnc)
        {
            // If we have child nodes, we'll write 
            // a parent node, then iterate over
            // the children
            if (node.Nodes.Count > 0)
            {
                xr.WriteStartElement(node.Text);
                saveNode2(node.Nodes);
                xr.WriteEndElement();    
            } 
            else //No child nodes, so we just write the text
            {
                xr.WriteString(node.Text);
            }
        }
    }
    

    问题出在哪里?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Jophy job    8 年前

    您使用的语言不是英语。请转换并保存。

    var text = File.ReadAllText(file, Encoding.GetEncoding(codePage));
    

    how-to-read-text-files-with-ansi-encoding-and-non-english-letters

    File.WriteAllText(filepath, filetext, Encoding.Unicode);
    

     new System.IO.StreamWriter(new FileStream(file_name,FileMode.OpenOrCreate),Encoding.ASCII);
    

    read-write-text-file-ansi-utf8-unicode

    how-to-convert-utf7-string-into-ansi-in-csharp

        2
  •  0
  •   jdweng    8 年前

    代码很好。xml应该如下所示

    <?xml version="1.0" encoding="utf-8" ?>
    <AAA>
       <BBB/>
       <CCC/>
    </AAA>
    
        3
  •  0
  •   yigit sertac    8 年前

    好的,我修改了几行,并且我管理了我想要的内容。

    首先,我为特殊字符添加char数组。并将其用于trim()函数。

     private void addTreeNode(XmlNode xmlNode, TreeNode treeNode)
            {
                **char[] karakter = new char[] { '<', '>', '/' };**
                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++)
                    {
                        xNode = xmlNode.ChildNodes[x];
                        treeNode.Nodes.Add(new TreeNode(xNode.Name));
                        tNode = treeNode.Nodes[x];
                        addTreeNode(xNode, tNode);
                    }
                }
                else
                {
                    treeNode.Text = xmlNode.OuterXml.Trim(**karakter**);
                }
    

    其次,如果没有子节点,我使用WriteRaw方法代替WriteString方法。因为特殊字符被WriteString方法替换。

    private void saveNode2(TreeNodeCollection tnc)
    {
        foreach (TreeNode node in tnc)
        {
            if (node.Nodes.Count > 0)
            {
                xr.WriteStartElement(node.Text);
                saveNode2(node.Nodes);
                xr.WriteEndElement();
            }
            else 
            {
                **xr.WriteRaw($"<{node.Text}/>");**
            }
        }
    

    但当我试图用两个根保存treeview时,它不会写入最后一个根。有什么意见吗?最后一个根的child写为第一个根的child。除此之外,代码可以工作。