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();
}
}
}
}
'개발관련 > C&C++' 카테고리의 다른 글
라이브러리 빌드 전/후 이벤트 명령어 (0) | 2018.03.16 |
---|---|
C#처럼 이벤트 처리 (0) | 2018.02.27 |
Xmllite SAX(Simple Api for Xml) TreeNode 구현 및 LIB (XMLParser) (0) | 2018.01.11 |
IOCP ThreadPool 구현 Lib 및 사용 방법 (0) | 2018.01.11 |
임계영역(Critical Section) (0) | 2018.01.05 |