使用封装的XML类存取树层次结构

版权声明:www.gudianxiaoshuo.com (古典小说网) 今日头条号: 古典古韵古典小说、讨厌编程 https://blog.csdn.net/shuilan0066/article/details/7740867


XML类基本操作:


在当前层新增一元素:

CXMLDeal::AddElem(L”新增元素”)

CXMLDeal::AddAttrib(L”属性”, int _or_CString);   为该元素添加属性 可以添加多个

 

进入某元素:

CXMLDeal::IntoElem()     进入元素内部  也即是进入子层

 

从内部子层返回该元素所在的层:

CXMLDeal::OutOfElem()   从内部子层返回该元素所在的层

 

定位某元素:

CXMLDeal::FindElem(L”首层”);    定位指定元素

定位后,获得该元素的某一属性:

CString  CXMLDeal::GetAttrib(L”Version”);  获得某一属性值

 


















树结构:



        保存时,采取先序遍历的顺序保存:先保存根节点,再保存左右节点。


树的层次结构是分层的,XML的结构也是分层的

按树的先序遍历,将各个节点保存到XML文件中。



树结构的保存:


树的保存

 

首层: 

 CXMLDeal  XmlDealSave;

  XmlDealSave.AddElem(L”首层”) 

  XmlDealSave.AddAtrrib(L”Version”, L”1.0”);   

 

建立树节点层:

 XmlDealSave.IntoElem();      // 进入首层内部  在其内部建立树

SaveNode(XmlDealSave, pTree); // 先序遍历,依次保存树的各个节点

XmlDealSave.OutOfElem();    //返回首层

}

 

树节点层先序遍历:

 

 SaveNode(CXMLDeal& XmlDealSave, Node* pTree){  // pTree 树或子树

   

      If(pTree==NULL)  return;

 

      XmlDealSave.AddElem(L”树节点”)  // 建立树根节点层

      XmlDealSave.AddAtrrib(L”节点属性”,int_or_cstring);

 

      pSon=pTree->Child;

      IF(pTree无孩子)

         XmlDealSave.AddAtrrib(L”HasChild”,NO );  //设置标志 标识无孩子

      ELSE{ //pSon存在

      XmlDealSave.AddAtrrib(L”HasChild”,YES );  //设置标志 标识有孩子

 

      XmlDealSave.IntoElem();   //进入树根节点内部

         

     DO{

         SaveNode(XmlDealSave, pSon);

         pSon=pTree节点的下一个孩子

 

     }while(pSon存在)

     XmlDealSave.OutOfElem();  //退出孩子层 返回根节点层

     }

}


 



树结构读取:


树的读取

 

加载XML文件: 

CXMLDeal  XmlDealRead ;

 XmlDealRead.Load(Path);

  XmlDealRead.ResetMainPos();    // 加载XML文件

 

读取首层信息:

 

      If(XmlDealRead.FindElem(L”首层”)){

    XmlDealRead.IntoElem();  // 进入首层内部

 

    XmlDealRead.FindElem(L”树节点”); //定位树根节点层

 

   pTree=ReadNode(XmlDealRead,NULL); //读取树

 

     XmlDealRead.OutOfElem(); // 返回首层

}

概要说明

树节点层先序遍历:

 

 ReadNode(CXMLDeal& XmlDealSave, Node* pcParent){  // pTree 树或子树

 

 Node* pNode=NULL;   

 CString szAtrribute;

 szAttribute=XmlDealSave.GetAttrib(L”HasChild”);

  

  IF(szAttribute!=L””){ //建立此节点,并调整相邻节点的关系

       pNode=new Node(); // 生成树根节点 

       …// 连接到父节点 并调整各节点关系

  }

 

 IF(szAttribute==L”Yes”){  //此节点有孩子

 

 XmlDealRead.IntoElem();  // 进入孩子节点层

 

While(XmlDealRead.FindElem(L”树节点”)) //定位具体的哪一个孩子层  

           pcSon=ReadNode(XmlDealRead,pNode); //读取此孩子子树节点

 

XmlDealRead.OutOfElem(); // 退出孩子节点层

}else IF( szAttribute==L”No”){

…    //读取无孩子节点的特殊属性

}

IF(pNode!=NULL)

  …     //读取其他公共属性属性

 

Return pNde;

}

详细说明

树节点层先序遍历:

 

 ReadNode(CXMLDeal& XmlDealSave, Node* pcParent){  // pTree 树或子树

 

 Node* pNode=NULL;   

 CString szAtrribute;

 szAttribute=XmlDealSave.GetAttrib(L”HasChild”);

  

 IF(szAttribute!=L””){ //建立此节点,并调整相邻节点的关系

  pNode=new Node(); // 生成树根节点 

  //将此节点连接到树结构中,并调整相邻节点的关系

 pNode->Parent=pcParent;    //调整父子节点关系

  if(pcParent)

           pcParent->Son=pNode; 

 … // 调整兄弟节点关系

}

 

IF(szAttribute==L”Yes”){  //此节点有孩子

 

XmlDealRead.IntoElem();  // 进入孩子节点层

 

While(XmlDealRead.FindElem(L”树节点”)){ //定位具体的哪一个孩子层

pcSon=ReadNode(XmlDealRead,pNode); //读取此孩子子树节点

}

XmlDealRead.OutOfElem(); // 退出孩子节点层

}else IF( szAttribute==L”No”){

//读取无孩子节点的特殊属性

}


IF(pNode!=NULL)

        //读取其他公共属性属性

Return pNde;

}







阅读更多

扫码向博主提问

shuilan0066

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • c++
  • mfc
  • python
  • duilib
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页