Comment afficher des nœuds de synthèse en liant des nœuds dans l'arborescence à des nœuds du document XML

StackOverflow https://stackoverflow.com/questions/602495

  •  03-07-2019
  •  | 
  •  

Question

J'ai une vue en arborescence où lors de la sélection d'un nœud, les attributs et les valeurs doivent être affichés dans une liste déroulante.
Dans treeView1_AfterSelect, le code d'analyse de texte dépend de la représentation textuelle d'un nœud dans la vue arborescente, qui peut être modifiée à tout moment et rompre toute la logique d'affichage de liste. Cette forte dépendance entre l'arborescence et l'affichage de la liste doit être éliminée en liant les nœuds de l'arborescence aux nœuds du document XML, afin que les données XML brutes puissent être utilisées pour afficher du texte dans la liste. Que dois-je écrire ici?

private static void AddingNodesToTree(XmlNode xmlNode,TreeNode tnode)  
        {  
            //Adding nodes to tree while looping through the entire XML file  
            if (xmlNode.HasChildNodes)  
            {  
                XmlNodeList nodeList = xmlNode.ChildNodes;                 
                for (int i = 0; i <= nodeList.Count - 1; i++)  
                {  
                    XmlNode xmladdtreeNode = xmlNode.ChildNodes[i];  
                    String nodetype = "" + xmladdtreeNode.NodeType;  
                    if (nodetype.Equals("Text") || nodetype.Equals("Comment"))    
                    {  
                    tnode.Nodes.Add(new TreeNode(xmladdtreeNode.InnerText));           
                    }  
                    else                                                    
                    {  
                        String name = "<" + xmladdtreeNode.Name;  
                        XmlAttributeCollection attCol = xmladdtreeNode.Attributes; 
                        foreach (XmlAttribute xmlatt in attCol)  
                        {  
                        name += " " + xmlatt.Name + "=\"" + xmlatt.Value + "\"";  
                        }  
                        name +=  ">";  
                        TreeNode tn = new TreeNode(xmladdtreeNode.Name);  
                        tn.Text = name;  
                        tnode.Nodes.Add(tn);  
                        TreeNode treeNode = tnode.Nodes[i];  
                        AddingNodesToTree(xmladdtreeNode,treeNode);   
                        }  
                }//for  
            }//if  
          else 
            {  
                tnode.Text = xmlNode.OuterXml.Trim();
            }//else   
        }//AddingNodesToTree  
        //To show Attributes and values of selected Nodes.  
        private void treeView1_AfterSelect(object sender,TreeViewEventArgs e)  
        {  
            TreeNode treenode = e.Node;   //Node selected in Treeview            
            String text = treenode.Text;  
            String relevent = text;  
            Boolean flag = true;  
            while (flag)  
            {  
                int SpaceIndex = relevent.IndexOf(" ");  
                if (SpaceIndex != -1)  
                {  
                    int indexofEqual = relevent.IndexOf('=', SpaceIndex);  
                    if (indexofEqual != -1)  
                    {  
                        int indexOFValue = relevent.IndexOf("\"", indexofEqual + 2);  
                        if (indexOFValue != -1)  
                        {  
  String attribute = relevent.Substring(SpaceIndex + 1, indexofEqual - SpaceIndex - 1);   
  String value = relevent.Substring(indexofEqual + 2, indexOFValue - indexofEqual - 2);   
  listBox1.Items.Add("Attribute : " + attribute + "   Value : " + value);                 
                            relevent = relevent.Substring(indexOFValue);
                        }
                        else
                        {
                         listBox1.Items.Add("Bad format of the xml file for this node");
                         flag = false;
                        }
                    }
                    else
                    {
                        flag = false;
                    }
                }
                else
                {
                    flag = false;
                }
            }
        }//AfterSelect()

Merci ....

Était-ce utile?

La solution

Si je comprends bien la question, vous souhaitez revenir au XmlNode lorsqu'un TreeNode est sélectionné. La solution habituelle consiste à stocker le XmlNode dans la propriété Tag:

TreeNode tn = new TreeNode();  
tn.Text = name;  
tn.Tag = xmladdtreeNode;

et dans AfterSelect

TreeNode treenode = e.Node; 
XmlNode xmlNode = (XmlNode) treeNode.Tag;

Autres conseils

J'ai essayé cela, mais j'ai obtenu l'exception NullRefrenceException sur cette ligne. foreach (XmlAttribute xmlatt dans attCol) sur attcol

Ceci est le code que j'ai écrit ..

private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
    {
        listBox1.Items.Clear();
        XmlNode xNode = e.Node.Tag as XmlNode;
        XmlAttributeCollection attCol = xNode.Attributes; 
        foreach (XmlAttribute xmlatt in attCol)
        {
            listBox1.Items.Add(xmlatt.Name);
            listBox1.Items.Add(xmlatt.Value);

        }
    } //AfterSelect()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top