개발관련/C&C++

Convert Json To Xml

Diademata 2018. 1. 17. 02:26
반응형

code : https://github.com/EomTaeWook/Cpp-XmlHelper


SAX 방식의 XML파서랑 합쳐놨음.


사용방법


jsoncpp로 파싱된 Json 객체를 넘겨받음.


xmllite로 xml 만듦


XmlHelper parser;

unique_ptr<char[]> buff(parser.JsonToXml(*JsonValue));


이렇게 사용하면 됨.



XmlHelper.h


#include <xmllite.h>

#include <atlbase.h>

#include <string>

#include "json.h"


//동적으로 Json을 xml로 변경

//Json 키에 @를 붙이면 xml 속성으로 write

//prifix는 구현하지 않음

//Json 읽을때 Iter로 읽기때문에 xml 순서는 뒤바뀜..;;;

class XmlHelper

{

public:

XmlHelper(){}

~XmlHelper(){}

char* JsonToXml(Json::Value& value);

private :

void JsonToXml(Json::Value& value, IXmlWriter* pWriter);

};



XmlHelper.cpp


#include "XmlHelper.h"

#pragma comment( lib , "xmllite.lib")

#pragma comment( lib , "json_vc71_libmtd.lib")


char* XmlHelper::JsonToXml(Json::Value& root)

{

IStream* pStream;

::CreateStreamOnHGlobal(0, TRUE, &pStream);

IXmlWriter *pWriter = NULL;

CreateXmlWriter(__uuidof(IXmlWriter), reinterpret_cast<void**>(&pWriter), NULL);

pWriter->SetProperty(XmlWriterProperty_Indent, TRUE);

pWriter->SetOutput(pStream);


pWriter->WriteStartDocument(XmlStandalone_Yes);

JsonToXml(root, pWriter);

pWriter->WriteEndDocument();

pWriter->Flush();


LARGE_INTEGER l;

l.QuadPart = 0;

pStream->Seek(l, 0, NULL);


HGLOBAL hg;

GetHGlobalFromStream(pStream, &hg);

int buffsize = GlobalSize(hg);

char *pBuff = new char[buffsize];

ULONG ulBytesRead;

pStream->Read(pBuff, buffsize, &ulBytesRead);


pWriter->Release();

pStream->Release();


delete pWriter;

delete pStream;


return pBuff;

}

void XmlHelper::JsonToXml(Json::Value& node, IXmlWriter* pWriter)

{

std::wstring key;

std::wstring value;

std::string tmp;

if (node.isArray())

{

for (int i = 0; i < node.size(); i++)

{

XmlHelper::JsonToXml(node[i], pWriter);

}

}

else

{

for (auto it = node.begin(); it != node.end(); ++it)

{

tmp = it.key().asString();

key.assign(tmp.begin(), tmp.end());

if (tmp.front() == '@')

{

tmp = (*it).asString();

value.assign(tmp.begin(), tmp.end());

pWriter->WriteAttributeString(L"", key.substr(1, key.length() - 1).c_str(), L"", value.c_str());

}

else

{

pWriter->WriteStartElement(NULL, key.c_str(), NULL);

if (it->size() > 0)

{

XmlHelper::JsonToXml(*it, pWriter);

}

else

{

tmp = (*it).asString();

value.assign(tmp.begin(), tmp.end());

pWriter->WriteString(value.c_str());

}

pWriter->WriteEndElement();

}

}

}

}



반응형