如何通过将树视图中的节点绑定到 XML 文档的节点来显示树节点

Posted

技术标签:

【中文标题】如何通过将树视图中的节点绑定到 XML 文档的节点来显示树节点【英文标题】:How to display treenodes by binding nodes in the treeview to nodes of the XML document 【发布时间】:2009-03-02 14:20:43 【问题描述】:

我有一个 Treeview,在其中选择一个节点时,属性和值必须显示在列表框中。 在treeView1_AfterSelect中,文本解析代码依赖于树视图中某个节点的文本表示,可以随时更改,打破了列表显示的整个逻辑。树视图和列表显示之间的这种强依赖关系应该通过将树视图中的节点绑定到 XML 文档的节点来消除,以便可以使用原始 Xml 数据在列表中显示文本。我应该在这里写什么?

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()

谢谢……

【问题讨论】:

【参考方案1】:

如果我正确理解了这个问题,您希望在选择 TreeNode 时返回 XmlNode。通常的解决方案是将 XmlNode 存储在 Tag 属性中:

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

在 AfterSelect 中

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

【讨论】:

请看你给我语法的答案。【参考方案2】:

我试过了,但在这一行得到了 NullRefrenceException foreach(attCol 中的 XmlAttribute xmlatt) 在 attcol 上

这是我写的代码..

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()

【讨论】:

谢谢我得到了我出错的地方并修复了它。

以上是关于如何通过将树视图中的节点绑定到 XML 文档的节点来显示树节点的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Xml 属性绑定到 Treeview 节点,同时将 XDocument 数据绑定到 WPF Treeview

将字符串 XML 片段转换为 Java 中的文档节点

XSLT如何仅对XML文档的字符串节点中的数值进行排序

了解 D3.js 如何将数据绑定到节点

如何使用 C# 通过读取另一个 XML 文件来创建 XML 文档?

如何将treeview的内容写入文本文件