C++XML读写

// CReadxml.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "CReadxml.h"
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <shlwapi.h>
#include "Markup.h"
using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define CELL "1111"
#define TRX "2222"

typedef  struct _STRUCT_CHECKITEM
{
 CString strPy;
 map<CString,  set<CString>*  >* mapItem;

 bool operator == ( const _STRUCT_CHECKITEM& val)
 {
  return val.strPy == strPy;
 }

} STRUCT_CHECKITEM;

 

typedef vector<STRUCT_CHECKITEM> CHECKITEMVECTOR;
typedef map<CString, set<CString>* > MEASITEMMAP;
typedef set<CString> COUNTERSSET;

 

// 唯一的应用程序对象

CWinApp theApp;

 

void ConvertCString2Set(const CString& strVal, set<CString>* setOut);
CString ConvertSet2CString(const set<CString>* setOut);
void Read2Xml(const CString& strPath, CHECKITEMVECTOR* vecCheckItem);
void WriteXML(const CString& strPath, CHECKITEMVECTOR* vecCheckItem);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;

 // 初始化 MFC 并在失败时显示错误
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: 更改错误代码以符合您的需要
  _tprintf(_T("错误: MFC 初始化失败\n"));
  nRetCode = 1;
 }
 else
 {
  // TODO: 在此处为应用程序的行为编写代码。
 }
 
 CHECKITEMVECTOR *mapCheckItem  = new CHECKITEMVECTOR;
 

 

 if(NULL != mapCheckItem)
 {
  Read2Xml("D:\\1.xml", mapCheckItem); 
  Read2Xml("D:\\2.xml", mapCheckItem); 
  WriteXML("D:\\out.xml", mapCheckItem);
 }

 

 

 


 return nRetCode;
}


void Read2Xml(const CString& strPath, CHECKITEMVECTOR* vecCheckItem)
{
 CMarkup markUp;
 markUp.Load(strPath);


 
 if(markUp.FindElem("root"))
 {
  markUp.IntoElem();
  while(markUp.FindElem("checkitem"))
  {
   CString strPy = markUp.GetAttrib("name");
   //create a object for find;
   _STRUCT_CHECKITEM pFind;
   pFind.strPy = strPy;

   //get the py's struct 
   _STRUCT_CHECKITEM CheckItemStru;

   //determine whether we can find the item
   CHECKITEMVECTOR::iterator iterFind = vecCheckItem->begin();
   iterFind = find(vecCheckItem->begin(), vecCheckItem->end(), pFind);

   //find same py
   if(vecCheckItem->end() !=  iterFind)
   {
    CheckItemStru = *iterFind;
   }
   else
   {
    CheckItemStru.mapItem = new MEASITEMMAP;
    CheckItemStru.strPy = strPy;
    vecCheckItem->push_back(CheckItemStru);
   }


   markUp.IntoElem();
   while(markUp.FindElem("measset"))
   {
    CString strMeasset = markUp.GetAttrib("ID");
    markUp.IntoElem();
    if(markUp.FindElem("measitem"))
    {
     CString strMeasitem = markUp.GetData();
     //the  measset map's item
     COUNTERSSET* pCountersSet;

     //find the measset map's item by measset id
     if(CheckItemStru.mapItem->end() != CheckItemStru.mapItem->find(strMeasset))
     {
      pCountersSet = (*CheckItemStru.mapItem)[strMeasset];
     }
     else
     {
      pCountersSet = new COUNTERSSET;
     }

     ConvertCString2Set(strMeasitem, pCountersSet);

      (*CheckItemStru.mapItem)[strMeasset] = pCountersSet;

    }
    markUp.OutOfElem();
   }
   markUp.OutOfElem();
  }
  markUp.OutOfElem();
 }
}


void WriteXML(const CString& strPath, CHECKITEMVECTOR* vecCheckItem)
{
 ASSERT(NULL != vecCheckItem);
 if(NULL == vecCheckItem)
 {
  return ;
 }
 if(PathFileExists(strPath))
 {
  CFile pFile;
  if(!pFile.Open(strPath, CFile::modeCreate))
  {
   return;
  }
  pFile.Close();
 }

 CMarkup markUp;
 markUp.SetDoc(_T("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"));
 markUp.AddElem("root");
 markUp.IntoElem();

 CHECKITEMVECTOR::iterator iterCheckitem = vecCheckItem->begin();
 for(; iterCheckitem != vecCheckItem->end(); ++iterCheckitem)
 {
  //checkitem
   markUp.AddElem("checkitem");
   markUp.SetAttrib("name", iterCheckitem->strPy);
   markUp.IntoElem();
   

  //measset
   MEASITEMMAP::iterator iterMeasset = iterCheckitem->mapItem->begin();
   for(; iterMeasset != iterCheckitem->mapItem->end(); ++iterMeasset)
   {
    CString strVal = ConvertSet2CString(iterMeasset->second);
    delete iterMeasset->second;

    markUp.AddElem("measset");
    markUp.SetAttrib("ID", iterMeasset->first);
    markUp.IntoElem();
    markUp.AddElem("measitem", strVal);
    markUp.OutOfElem();
   }

  delete iterCheckitem->mapItem;
  markUp.OutOfElem();
 }
 markUp.OutOfElem();
 delete vecCheckItem;

 markUp.Save(strPath);
}

 


void ConvertCString2Set(const CString& strVal, set<CString>* setOut)
{
 CString str = strVal;
 str += ",";
 CString strTemp;
 size_t  nPos = 0;

 do
 {
  nPos = str.Find(",");
  strTemp = str.Mid(0,nPos);
  str = str.Mid(nPos + 1,str.GetLength());
  setOut->insert(strTemp);
 }while(str.GetLength() > 0);
};

CString ConvertSet2CString(const set<CString>* setOut)
{
 CString strOut;
 set<CString>::const_iterator iterStr = setOut->begin();
 for(; iterStr != setOut->end(); ++ iterStr)
 {
   strOut += *iterStr + ",";
 }

 strOut.Left(strOut.GetLength() - 1);

 return CString(strOut);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值