1. 程式人生 > 程式設計 >C++常用函式之XML JSON格式轉換問題

C++常用函式之XML JSON格式轉換問題

資料格式在程式設計裡面很常見,不同的系統都會有自己的標準。因為給有各的定義,每次做第三方開發系統對接的時候資料格式標準都是頭疼的事情。

在開發過程中比較常見的比如有Json、XML、Key-Value等。這裡我們就先看看Json和XML。兩者的轉換有很多開源的程式碼可以使用,而且也很完善,可以參考xml2json、xsltjson。

XML在Json出現前應用很廣泛,靈活性好,應用語言也沒有限制,發展了這麼長時間後xml標準已經很臃腫。這裡可以檢視XML的標準XML標準。在C++裡面解析和操作XML的庫也有不少,tinyxml 就是個不錯的選擇,體積少、簡單、高效的開源庫,現在已經發布了TinyXml-2.

Json出來後立即被很多高階語言作為了標準推薦使用,如果想了解Json的定義請點選這裡:JSON定義

XML2Json & Json2XML

接下來,我想做個簡單的函式來轉換。

<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格式的自由轉換。

#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以上。

可以使用下面命令編譯:

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

知識點擴充套件:C++常用的系統函式

數學<math.h>:

1 三角函式

double sin (double);
double cos (double);
double tan (double);

2 反三角函式

double asin (double); 結果介於[-PI/2,PI/2]
double acos (double); 結果介於[0,PI]
double atan (double); 反正切(主值),結果介於[-PI/2,PI/2]
double atan2 (double,double); 反正切(整圓值),PI/2]

3 雙曲三角函式

double sinh (double);
double cosh (double);
double tanh (double);

4 指數與對數

double exp (double x); e的x次冪
double pow (double x,double y); x的y次冪
double sqrt (double);
double log (double x); 以e為底的對數,即ln x
double log10 (double x);log10(x) 以10為底。

沒有以2為底的函式但是可以用換底公式解 決:log2(N)=log10(N)/log10(2)

5 取整

double ceil (double); 不小於x的最小整數
double floor (double); 不大於x的最大整數

6 絕對值

int abs(int);整型
long labs(long);長整型
double fabs (double);浮點型

7 標準化浮點數

double frexp (double f,int p); 標準化浮點數,f = x 2^p,已知f求x,p ( x介於[0.5,1] )
double ldexp (double x,int p); 與frexp相反,已知x,p求f

8 取整與取餘

double modf (double,double*); 將引數的整數部分通過指標回傳,返回小數部分
double fmod (double,double); 返回兩引數相除的餘數

9.平方根

double sqrt(double x);

字元<ctype.h>:

int isalpha(int c);c是否為字母
int isdigit(int c);c是否為數字
int tolower(int c);將c轉換為小寫字母
int toupper(int c);將c轉換為大寫字母

字串<string.h>:

char strcpy(char sl,char s2);將字串s2複製給s1,即覆蓋
unsigned strlen(char sr);求字串str長度

記憶體操作<memory.h>:

void memcpy(void d,void *s,int c);將s指向的記憶體區域的c個位元組複製到d指向的區域

型別轉換<stdlib.h>:

int atoi(char s);將字串轉化為整數
char itoa(int v,char *s,int x);將整數v按x進位制轉成字串s

時間<time.h>:

time_t time(time_t *timer);返回1970/1/1零點到目前的秒數

其他<stdlib.h>:

srand(unsigned seed);設定隨機數的種子
int rand();產生0-RAND_MAX的隨機數
exit(int);終止正在執行的程式

keep going

到此這篇關於C++常用函式之XML JSON格式轉換問題的文章就介紹到這了,更多相關c++ xml json格式轉換內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!