c#解析xml绑定treeview控件实现

	向web端的api发送http请求,得到的结果是xml格式的节点信息,id标识节点号,pid标识该节点的父节点(0表示根),name是名字。

节点信息本来是web端通过dfs得到的。

原本的思路是:根据xml节点,解析它,构建邻接矩阵或者邻接表,用dfs(先序,遍历到就添加到treeview里去)生成treeview,c语言做算法实现比较好搞,c#水平有限,毕竟google没了,自己baidu做项目 = = 

换了个思路,因为api得到的xml节点顺序正好是dfs得到的,因此我只要根据这个顺序建立节点绝对没问题,因为每个节点插入进去,绝对能够找到父节点!

有思路了,直接开撸。

附上xml:


	
		1
		0
		5YiG57G7MQ==
	
	
		2
		1
		5YiG57G7MS0x
	
	
		3
		2
		5YiG57G7MS0xLTE=
	
	
		4
		2
		5YiG57G7MS0xLTI=
	
	
		5
		1
		5YiG57G7MS0y
	
	
		6
		0
		5YiG57G7Mg==
	
	
		9
		6
		5YiG57G7Mi0x
	

name是用base64编码过的结果,取出来解码就可以。

使用了一个类来定义xml的节点,便于还原节点。

附上treeNode的定义:


public class TreesNode
        {
            public TreesNode parent;

            private int id; //当前节点id

            public int Id
            {
                get { return id; }
                set { id = value; }
            }

            private int pid; //父节点 0表示根

            public int Pid
            {
                get { return pid; }
                set { pid = value; }
            }

            public string name = null;
 
            public TreesNode(int id, int pid, string name)
            {
                this.id = id;
                this.pid = pid;
                this.name = TreesNode.decriptionBase64(name); 
            }

            public static string decriptionBase64(string oralName)
            {
                byte[] outputb = Convert.FromBase64String(oralName); //base64解码           
                string resultName = Encoding.GetEncoding("utf-8").GetString(outputb);
                return resultName; 
            }
        }

然后是解析xml生成treeNode数组的过程,解析的时候注意逻辑就好

/// 
        /// 解析xml 生成dfs需要的数组
        /// 
        /// 
        public void translateXML(string xmlFile)
        {
            int id, pid,temp;
            string name;

            XmlDocument doc = new XmlDocument();   
            doc.Load(xmlFile);   //加载Xml文件  
            XmlElement rootElem = doc.DocumentElement;   //获取根节点  
            XmlNodeList itemNodes = rootElem.GetElementsByTagName("item"); //获取item子节点集合  

            //根节点先进去
            ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode firstOne = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(0, 0, "5pyN5Yqh5Zmo");  //服务器
            firstOne.parent = null;
            actualTreeNodes[0] = firstOne;
            countActualTreeNodes++;

            //之后所有的item节点根据xml放进数组中去
            foreach (XmlNode node in itemNodes)
            {
                //读取item下的id pid name

                XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("id");

                if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true)
                {
                    id = temp;
                    subAgeNodes = ((XmlElement)node).GetElementsByTagName("pid");
                    if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true) 
                    {
                        pid = temp;
                        subAgeNodes = ((XmlElement)node).GetElementsByTagName("name");
                        name = subAgeNodes[0].InnerText;
                        //ok!!!!生成数组!!!! 节点的顺序就是web端dfs得到的,
                        //根据 id 确定存放在 actualTreeNode 数组的位置,通过每个对象的 pid 属性来确定添加到对应的 treeview 节点下
                        ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode tempNode = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(id, pid, name);
                        tempNode.parent = actualTreeNodes[pid];
                        actualTreeNodes[id] = tempNode;
                        if( tempNode.Id > countActualTreeNodes )
                        {
                            countActualTreeNodes = tempNode.Id;
                        }
                    }      
                }
          

用了数组来保存解析的node并且计数方便读取。

 //存放xml读取出来的treenode节点,先从xml读取出来生成数组,然后treeview根据每个节点的father为treeview来add节点
        private ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode[] actualTreeNodes = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode[50];

        //计数
        private int countActualTreeNodes = 0;


然后生成treeview即可,思路:

根据actualTreeNodes数组,添加每个节点到treeview,根据name遍历寻找父亲节(xml是dfs得到所以父亲) 点然后添加(拿name遍历数组即可

/// 
        /// 解析xml 生成dfs需要的数组
        /// 
        /// 
        public void translateXML(string xmlFile)
        {
            int id, pid,temp;
            string name;

            XmlDocument doc = new XmlDocument();   
            doc.Load(xmlFile);   //加载Xml文件  
            XmlElement rootElem = doc.DocumentElement;   //获取根节点  
            XmlNodeList itemNodes = rootElem.GetElementsByTagName("item"); //获取item子节点集合  

            //根节点先进去
            ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode firstOne = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(0, 0, "5pyN5Yqh5Zmo");  //服务器
            firstOne.parent = null;
            actualTreeNodes[0] = firstOne;
            countActualTreeNodes++;

            //之后所有的item节点根据xml放进数组中去
            foreach (XmlNode node in itemNodes)
            {
                //读取item下的id pid name

                XmlNodeList subAgeNodes = ((XmlElement)node).GetElementsByTagName("id");

                if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true)
                {
                    id = temp;
                    subAgeNodes = ((XmlElement)node).GetElementsByTagName("pid");
                    if (int.TryParse(subAgeNodes[0].InnerText, out temp) == true) 
                    {
                        pid = temp;
                        subAgeNodes = ((XmlElement)node).GetElementsByTagName("name");
                        name = subAgeNodes[0].InnerText;
                        //ok!!!!生成数组!!!! 节点的顺序就是web端dfs得到的,
                        //根据 id 确定存放在 actualTreeNode 数组的位置,通过每个对象的 pid 属性来确定添加到对应的 treeview 节点下
                        ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode tempNode = new ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode(id, pid, name);
                        tempNode.parent = actualTreeNodes[pid];
                        actualTreeNodes[id] = tempNode;
                        if( tempNode.Id > countActualTreeNodes )
                        {
                            countActualTreeNodes = tempNode.Id;
                        }
                    }      
                }
            }
        }

        /// 
        /// 根据actualTreeNodes数组,添加每个节点到treeview,根据name遍历寻找父亲节点然后添加(拿name遍历数组即可)
        /// 
        public void addTreeViewNode() 
        {         
            treeViewNode.Nodes.Clear();
            treeViewNode.Nodes.Add(new TreeNode("服务器"));     //根节点加入treeview

            for (int i = 1; i <= countActualTreeNodes; i++)
            {
                //取得当前节点 遍历以前的所有节点找它的父节点,然后添加到父节点下面去!
                //遍历所有treeview中的节点,寻找当前节点的父节点,插入treeview中去(根据dfs的结果,父节点一定存在)

                //currentNode为当前需要插入节点,遍历treeviewNode中所有节点,寻找它的父亲,插入父亲下面!父亲一定存在! 
                ITAMngApp.TkMng.UpLoadForm.TreeDefinition.TreesNode currentNode = actualTreeNodes[i];

                //更新bool
                //finish = false;

                if (currentNode == null)
                {
                    continue;
                }
                foreach (TreeNode item in treeViewNode.Nodes)
                {
                    // item是当前节点,这里是遍历所有treeview节点,找出actual[i]的父亲,然后插入i
                    TreeNode node = GetNode(item, i);   
                    if (currentNode.parent.name == node.Text )
                    {
                        Console.WriteLine("fuck1");
                        TreeNode tempInsertOne = new TreeNode(currentNode.name);
                        treeViewNode.SelectedNode = node;                                  
                        treeViewNode.SelectedNode.Nodes.Add(tempInsertOne);

                        //node.Nodes.Add(tempInsertOne);                                    //这个add这里有问题!
                        //finish = true;
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            treeViewNode.CollapseAll();
        }

        //遍历子节点
        public TreeNode GetNode(TreeNode currentRoot, int currentNumber)
        {    
            if (currentRoot.Nodes.Count == 0)     //如果是根,返回  
            {
                Console.WriteLine("fuck3");
                //return currentRoot.Nodes[0];
                return treeViewNode.TopNode;   //返回定点 只会执行一次
            }
            else if (treeViewNode.Nodes.Count != 0)     //非根节点
            {
                Console.WriteLine("fuck4");
                TreeNode[] treeNodes = treeViewNode.Nodes.Find(currentRoot.Name, true);  //可以返回所有以currentRoot.test为标识的节点
                foreach (TreeNode temp in treeNodes)
                {
                    if (actualTreeNodes[currentNumber].parent.name == temp.Text)
                    {
                        return temp;
                        //temp.Nodes.Add(new TreeNode(actualTreeNodes[currentNumber].name));
                    }
                }
            }
            return currentRoot;
        }

        /// 
        /// TreeViewNode点击事件相应
        /// 
        /// 
        /// 
        private void treeViewNode_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string messageAfterSelect = string.Format("选中了{0}节点\n\n深度{1}的节点", treeViewNode.SelectedNode.Text, treeViewNode.SelectedNode.Level);
            MessageBox.Show(messageAfterSelect, "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
        }

成功绑定treeview!附上效果图:

c#解析xml绑定treeview控件实现_第1张图片

















你可能感兴趣的:(C#)