关于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(); //兄弟节点找完以后,弹出
}
}
代码我只展示了最核心的部分,其他的没必要展示出来,和普通的也没什么区别了。主要是想说下递归的思想:我主要是根据树型图是否展开的状态来保存的,第一次碰见展开的进去,然后递归,再判断的它的子节点是否展开,没展开就是兄弟节点,然后这样一层一层的走下去。
我表达能力不是很好,如果大家写到类似的功能的话,可以参考,我代码旁的注释写的很详细了,多多调试哈哈。
这是展开的树型图
保存以后生成的xml文件
因为图片大小关系,一些控件就没有截进去,仅仅是为了展示核心功能:递归读取树型图里面的信息到xml文件中