Pugi xml 활용법



지난번 포스팅에서 pugi xml을 다운로드 받고 사용준비까지 마쳤어요. 

이제는 pugi xml을 어떻게 사용할까 하는 방법을 적어볼까해요. 물론 저만의 방법이니 다른 좋은방법들이 많이 있으리라 생각되어요. 이게 정답은 아니니 그냥 참고 정도로만 해 주세요^^


먼저 사용방법은요


//----------------------------------------------------------------- Pugixml API

#include "pugixml.hpp"


//------------------------------------------------------------------------ Json

#include "json\document.h"

#include "json\writer.h"

#include "json\reader.h"

#include "json\prettywriter.h"

#include "json\stringbuffer.h"


//-----------------------------------------------------------Cocos2d Name space

USING_NS_CC;

using namespace rapidjson;



요것들을 해더 파일에 include 해 줍니다.


그리고 나서 cpp 파일에는 아래처럼 구현해 주면 끝! 

xml 파일을 불러오고 또 그 파일안에 있는 내용을 읽어오는 코드에요.

void MainScene::getPugixmlSample()

{

pugi::xml_document _xmlDoc;

pugi::xml_node _xmlNode;


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");


  // read data from xml file

pugi::xml_node stage = _xmlNode.child("stage");

        int world = stage.attribute("world").as_int();

int slot = stage.attribute("slot").as_int();

}



아참, 아래는 xml 파일이에요


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<root>

<stage world="0" slot="0"/>

</root>



자 이렇게 하면 간단하게 pugi xml을 사용할 수 있지만 이걸 담당할 입출력 클래스를 하나 만들어 두면 두고 두고 사용할 수 있어서 편리한것 같아서 한번 공유해 보아요.


방법은 간단해요. 아래처럼 클래스 하나 만들면 끝


헤더파일이구요


#ifndef __XmlMngt_H__

#define __XmlMngt_H__


//--------------------------------------------------------------Cocos2d Include

#include "cocos2d.h"


//----------------------------------------------------------------- Pugixml API

#include "pugixml.hpp"


//------------------------------------------------------------------------ Json

#include "json\document.h"

#include "json\writer.h"

#include "json\reader.h"

#include "json\prettywriter.h"

#include "json\stringbuffer.h"


//-----------------------------------------------------------Cocos2d Name space

USING_NS_CC;

using namespace rapidjson;


//-----------------------------------------------------------------------------

class XmlMngt

{

public:

XmlMngt();

~XmlMngt();


// Singleton object

static XmlMngt& getInstance();

static void releaseInstance();

static XmlMngt* m_pInstance;


void loadXml();


int getHighScore();

  void setHighScore(const int &iScore);


void saveXml();


private:

pugi::xml_document _xmlDoc;

pugi::xml_node _xmlNode;

};


#endif




Cpp 파일이에요


#pragma execution_character_set("utf-8")



#include "XmlMngt.h"


XmlMngt *XmlMngt::m_pInstance = nullptr;


XmlMngt::XmlMngt()

{

loadXml();

}


XmlMngt::~XmlMngt() {}


XmlMngt& XmlMngt::getInstance()

{

if (m_pInstance == nullptr)

m_pInstance = new XmlMngt();


return *m_pInstance;

}


void XmlMngt::releaseInstance()

{

if (m_pInstance != nullptr)

delete m_pInstance;

}



void XmlMngt::loadXml()

{

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::saveXml()

{

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

configPath.append("data.xml");

_xmlDoc.save_file(configPath.c_str());

}


int XmlMngt::getHighScore(const int &iScore)

{

pugi::xml_node highscore = _xmlNode.child("highscore");

_gHighScore = highscore.attribute("score").as_llong();

if (iScore > _gHighScore)

{

_gHighScore = iScore;

highscore.attribute("score").set_value(_gHighScore);

saveXml();

}

}


void XmlMngt::setHighScore(const int &iScore)

{

pugi::xml_node highscore = _xmlNode.child("highscore");

_gHighScore = highscore.attribute("score").as_int();

if (iScore > _gHighScore)

{

_gHighScore = iScore;

highscore.attribute("score").set_value(_gHighScore);

saveXml();

}

}


간단하게 pugi xml 데이터를 입출력할 수 있는 클래스가 완성되었어요.

그냥 테스트용으로만들어 본것이니 실제는 여기에 다양한 코드들이 들어갈 수 있겠지요.


아참 마지막으로 디버깅할때 xml 파일이 어디로 복사되어 있는지 모를때가 있는데 그럴때에는 아래 경로처럼 찾아서 들어가면된답니다.


c:\사용자\[개인계정]\AppData\Local\Mudman


보통은 AppData 요 폴더는 숨김되어 있으니 숨김해제해서 찾아 들어가세요^^