C++經常使用函數 XML JSON格式轉換

C++經常使用函數 XML JSON格式轉換php

數據格式在編程裏面很常見,不一樣的系統都會有本身的標準。由於給有各的定義,每次作第三方開發系統對接的時候數據格式標準都是頭疼的事情。html

在開發過程當中比較常見的好比有Json、XML、Key-Value等。這裏咱們就先看看Json和XML。二者的轉換有不少開源的代碼可使用,並且也很完善,能夠參考xml2jsonxsltjsonios

XML在Json出現前應用很普遍,靈活性好,應用語言也沒有限制,發展了這麼長時間後xml標準已經很臃腫。這裏能夠查看XML的標準 XML標準。在C++裏面解析和操做XML的庫也有很多,tinyxml 就是個不錯的選擇,體積少、簡單、高效的開源庫,如今已經發布了TinyXml-2.c++

Json出來後當即被不少高級語言做爲了標準推薦使用,若是想了解Json的定義請點擊這裏:JSON定義git

XML2Json & Json2XML

接下來,我想作個簡單的函數來轉換。github

<xml>
    <appid>appid-value111111</appid>
    <mch_id>mch_id-value22222</mch_id>
    <nonce_str>nonce_str-value3333333</nonce_str>
    <transaction_id>transaction_id-value44444444</transaction_id>
    <sign>sign-value5555555555</sign>
</xml>

上面的報文是在三方支付裏面常見的報文,此次咱們來實現對這段報文的Json格式的自由轉換。shell

#include <string>
#include <iostream>
#include "tinyxml2.h"
#include "nlohmann/json.hpp"

using json = nlohmann::json;
using namespace tinyxml2;
using namespace std;

string xml2json(string &src)
{
    XMLDocument doc;
    doc.Parse( src.c_str() );
    
    json  root;
    XMLElement* rootElement = doc.RootElement();
    XMLElement* child = rootElement->FirstChildElement();
    while(child) {
        const char* title = child->Name() ;
        const char* value = child->GetText();
        child = child->NextSiblingElement();
        root[title]=value ;
    }
    return  root.dump() ;
}

string json2xml(string& src)
{
    XMLDocument xmlDoc;
    XMLNode * pRoot = xmlDoc.NewElement("xml");
    xmlDoc.InsertFirstChild(pRoot);
    auto j3 = json::parse(src.c_str());
    for (json::iterator it = j3.begin(); it != j3.end(); ++it) {
        string key = it.key();
        string value = it.value() ;
        XMLElement * pElement = xmlDoc.NewElement(key.c_str()) ;
        pElement->SetText(value.c_str()) ;
        pRoot->InsertEndChild(pElement);
    }
    XMLPrinter printer;
    pRoot->Accept( &printer );
    return printer.CStr();
}

int main()
{
    string src = "<xml>\
                   <appid>appid-value111111</appid>\
                   <mch_id>mch_id-value22222</mch_id>\
                   <nonce_str>nonce_str-value3333333</nonce_str>\
                   <transaction_id>transaction_id-value44444444</transaction_id>\
                   <sign>sign-value5555555555</sign>\
                </xml>" ;
    string json = xml2json(src) ;
    string xml = json2xml(json) ;
    
    
    cout << json ;
    cout << endl ;
    cout << xml ;
}

此次咱們使用tinyxml2 和nlohmann json 作轉換,須要將二者的頭文件和源代碼文件下載,並在編譯中include。編程

nolhmann json 須要C++ 11 的支持,gcc版本須要在4.7以上。json

可使用下面命令編譯:app

g++ -std=c++11 xmljson.cpp tinyxml2.cpp -I./

./a.out
{"appid":"appid-value111111","mch_id":"mch_id-value22222","nonce_str":"nonce_str-value3333333","sign":"sign-value5555555555","transaction_id":"transaction_id-value44444444"}
<xml>
    <appid>appid-value111111</appid>
    <mch_id>mch_id-value22222</mch_id>
    <nonce_str>nonce_str-value3333333</nonce_str>
    <sign>sign-value5555555555</sign>
    <transaction_id>transaction_id-value44444444</transaction_id>
</xml>

C++經常使用函數 XML JSON格式轉換 https://www.cppentry.com/benc...

開發資料 https://www.cppentry.com

相關文章
相關標籤/搜索