MFC树型图递归导入xml文件

关于mfc里面的根据树型图生成xml文件,网上已经有很多人贴出了自己的代码。关于这些,我就不复制粘贴了。我前几天收到任务,公司要求我根据用户点击展开的树型图,生成相应的xml文件。我在网上找了一圈,没看见写过类似的代码。于是自己花了一两天的时间(包括学习xml),终于给折腾出来了。
思路模式用的是递归,深度递归遍历。先贴代码

    void CFilexml::Cycle( CTreeCtrl *tree,HTREEITEM hItem,CMarkup &xml )   //递归
{

    HTREEITEM   hChildItem = tree->GetChildItem(hItem);     //该节点的子节点
    if(TVIS_EXPANDED&m_CTree->GetItemState(hItem,TVIS_EXPANDED))    //上一级目录是否展开
    {
        //int n=tree->ItemHasChildren(hChildItem);
        //if (( 0!=n)&&(1==n))                                      //查看是否有子节点
        //{
            TreeNode * currentNode = (TreeNode*)(m_CTree->GetItemData(hChildItem));  //获取节点里面的信息,我是用的一个类保存的
            CString address=currentNode->GetFileAddress();
            CString name=currentNode->GetFileName();
            CString filetype=currentNode->GetFileType();
            CString time=currentNode->GetWriteTime();
            CString size=currentNode->GetFileSize();
            if(TVIS_EXPANDED&m_CTree->GetItemState(hChildItem,TVIS_EXPANDED))   //判断这个节点是否展开,展开就进去,否则加入兄弟节点
            {       
                xml.AddElem(_T("Node"));    
                xml.SetAttrib(_T("FileType"),wstring(filetype));
                xml.SetAttrib(_T("WriteTime"),wstring(time));
                xml.SetAttrib(_T("FileSize"),wstring(size));
                xml.SetAttrib(_T("FileName"),wstring(name));
                xml.IntoElem();
            }
            else
            {
                xml.AddElem(_T("BrotherNode")); 
                xml.SetAttrib(_T("FileType"),wstring(filetype));
                xml.SetAttrib(_T("WriteTime"),wstring(time));
                xml.SetAttrib(_T("FileSize"),wstring(size));
                xml.SetAttrib(_T("FileName"),wstring(name));
            }
            Cycle(tree,hChildItem,xml);
    //}
    }
    HTREEITEM hSib = tree->GetNextSiblingItem(hItem);    //同一级节点
    if (hSib != NULL)  //如果没展开,找平行的兄弟节点
    {
        TreeNode * currentNode = (TreeNode*)(m_CTree->GetItemData(hSib));
        CString address=currentNode->GetFileAddress();
        CString name=currentNode->GetFileName();
        CString filetype=currentNode->GetFileType();
        CString time=currentNode->GetWriteTime();
        CString size=currentNode->GetFileSize();
        if(TVIS_EXPANDED&m_CTree->GetItemState(hSib,TVIS_EXPANDED))
        {   
            xml.AddElem(_T("Node"));
            xml.SetAttrib(_T("FileType"),wstring(filetype));
            xml.SetAttrib(_T("WriteTime"),wstring(time));
            xml.SetAttrib(_T("FileSize"),wstring(size));
            xml.SetAttrib(_T("FileName"),wstring(name));
            xml.IntoElem();
        }
        else
        {
            xml.AddElem(_T("BrotherNode"));
            xml.SetAttrib(_T("FileType"),wstring(filetype));
            xml.SetAttrib(_T("WriteTime"),wstring(time));
            xml.SetAttrib(_T("FileSize"),wstring(size));
            xml.SetAttrib(_T("FileName"),wstring(name));
        }


        Cycle(tree,hSib,xml);
    }
    else
    {
        xml.OutOfElem();  //兄弟节点找完以后,弹出
    }

}

代码我只展示了最核心的部分,其他的没必要展示出来,和普通的也没什么区别了。主要是想说下递归的思想:我主要是根据树型图是否展开的状态来保存的,第一次碰见展开的进去,然后递归,再判断的它的子节点是否展开,没展开就是兄弟节点,然后这样一层一层的走下去。
我表达能力不是很好,如果大家写到类似的功能的话,可以参考,我代码旁的注释写的很详细了,多多调试哈哈。
这是展开的树型图
MFC树型图递归导入xml文件_第1张图片

保存以后生成的xml文件
MFC树型图递归导入xml文件_第2张图片

因为图片大小关系,一些控件就没有截进去,仅仅是为了展示核心功能:递归读取树型图里面的信息到xml文件中

你可能感兴趣的:(MFC)