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 요 폴더는 숨김되어 있으니 숨김해제해서 찾아 들어가세요^^
'개발 > 코딩' 카테고리의 다른 글
인디게임 개발에 필요한 무료이미지 사이트 (0) | 2016.11.04 |
---|---|
[Coco2dx 개발이야기] 코코스2dx에서 Android 진동함수(Vibrator) 호출하는 방법 (0) | 2016.11.03 |
[코코스2dx 개발이야기] coco2dx에서 Android JNI 호출 방법 (0) | 2016.11.03 |
안드로이드 INSTALL_FAILED_CONFLICTING_PROVIDER 문제해결방법 / 페이스북 앱 ID (2) | 2016.10.07 |
[pugi xml 사용방법 1탄] pugi xml 다운로드 및 import 하기 (android cocos2dx 개발 xml 사용방법 / pugi xml / pugi xml node (0) | 2016.10.05 |
[코코스2d 이야기] 코코스 2dx에서 font 동적생성 및 outline 사용방법 (0) | 2016.10.05 |
Trouble shoot for does not have android.permission.SEND_SMS case in Android (0) | 2016.09.29 |
잘되던 안드로이드 문자보내기 기능이 권한문제때문에 갑자기 안될때(does not have android.permission.SEND_SMS) (0) | 2016.09.29 |
최근댓글