您好,登錄后才能下訂單哦!
怎么在C++中對XML與JSON格式進行轉換?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
<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, 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
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。