COCOS2DX 에서 PUGIXML 사용방법 및 소스코드

2016. 2. 19. 16:09Korean/개발백과사전

COCOS2dx + pugixml


오늘은 pugixml 사용방법에 대해서 간략하게 적어볼까합니다. 본 예제는 안드로이드 환경에서 Cocos2d로 개발을 진행할때 사용하였으며 개인에 따라 사용방법은 다를 수 있으니 그냥 참고만 하세요.


먼제 pugixml을 사용하기 위해서는 파일을 다운 받아야 합니다.

PUGIXML 다운로드 받는 곳 : http://pugixml.org/



pugixml-1.7.zip 요걸 다운 받습니다. 다운 받은 파일의 압축을 풀어보면 아래와 같이 나오는데요,




여기서 src 폴더로 이동합니다.



요기 있는 세 파일 이 전부 입니다.

요걸 사용하고자 하는 폴더로 복사해 주시면 일단 준비는 완료!!

복사하는 방법은 Ctrl + C 해서 본인의 프로젝트 소스파일에 Ctrl + V 해도 되구요


아니면 Visual Studio를 사용하고 있다면 아래와 같이 "Existing Item" 메뉴를 사용해도 무방합니다.





자 이제부터 어떻게 사용하는지 몇가지 예제를 적어보겠습니다.



// 우선 위 헤더파일을 Include 해 주구요,

#include "pugixml.hpp"


// 네임스페이스도 정의해 줍니다.
using namespace rapidjson;

// 그리고 변수 선언도 해주구요

pugi::xml_document _xmlDoc;
pugi::xml_node _xmlNode;


이러면 끝


그 담부터는 그냥 사용하시면 됩니다.


// xml 파일 생성 또는 로드는 아래처럼 하면 되구요


void XmlMngt::initGameData()

{

std::string path = CCFileUtils::sharedFileUtils()->getWritablePath();

path.append("data.xml");


if (!FileUtils::sharedFileUtils()->isFileExist(path))

{

auto data = FileUtils::getInstance()->getDataFromFile("data/data.xml");

std::string dbPath = FileUtils::getInstance()->getWritablePath() + "data.xml";


FILE* dest = fopen(dbPath.c_str(), "wb");

fwrite(data.getBytes(), 1, data.getSize(), dest);

fclose(dest);

}


unsigned char* pBuffer = NULL;

ssize_t bufferSize = 0;

pBuffer = CCFileUtils::sharedFileUtils()->getFileData(path.c_str(), "r", &bufferSize);

if (_xmlDoc.load_buffer(pBuffer, bufferSize))

_xmlNode = _xmlDoc.child("root");

}



저장하는 방법은 뭐 대충 요렇게


void XmlMngt::saveGameData()

{

std::string configPath = CCFileUtils::sharedFileUtils()->getWritablePath();

configPath.append("data.xml");

_xmlDoc.save_file(configPath.c_str());

}



//특정 데이터 불러오기는 요런식으로


void XmlMngt::getMyStat(MyStat &oStat)

{

pugi::xml_node it = _xmlNode.child("main");

oStat.Name = it.attribute("myname").value();

oStat.Money = it.attribute("money").as_llong();

oStat.GoldSpoon = it.attribute("goldspoon").as_int();

oStat.Level = it.attribute("level").as_int();

oStat.Stand = it.attribute("stand").value();

}



//데이터를 수정하고 저장할때는 이렇게 하면 되겠죠


void XmlMngt::setMyStat(const MyStat &iStat)

{

pugi::xml_node it = _xmlNode.child("main");

it.attribute("money").set_value(iStat.Money);

it.attribute("goldspoon").set_value(iStat.GoldSpoon);

it.attribute("myname").set_value(iStat.Name.c_str());

it.attribute("stand").set_value(iStat.Stand.c_str());

it.attribute("level").set_value(iStat.Level);

saveGameData();

}



제가 실제로 사용했던 코드를 같이 첨부합니다.

지우고 검색하고 이런 코드들도 있으니

조금이나마 도움이 되었으면 합니다. 

---------------------------------------------------------------------------------------------------


pugiconfig.hpp


pugixml.cpp


pugixml.hpp


XmlMngt.cpp


XmlMngt.h



물론 이렇게 안하고 더 효율적으로 하는 방법들이 있을 것입니다.

다만 처음 사용할때 참고용으로만 읽어주세요.