专栏首页cppentryC++ XML JSON格式转换

C++ XML JSON格式转换

数据格式在编程里面很常见,不同的系统都会有自己的标准。因为给有各的定义,每次做第三方开发系统对接的时候数据格式标准都是头疼的事情。

在开发过程中比较常见的比如有Json、XML、Key-Value等。这里我们就先看看Json和XML。两者的转换有很多开源的代码可以使用,而且也很完善,可以参考xml2jsonxsltjson

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>

原文链接:https://www.cppentry.com/do/bencandy.php?fid=49&aid=265715

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​C++ Swap函数有几种写法?

    整型数比较容易理解,如果是字符串呢?字符串交换不能直接使用上面类似的方法赋值,想想原因是啥?:)

    宇航
  • C++ 获取当前系统时间

    time() 是系统C语言的标准接口,通过man time 或者man 2 time 可查看详细的使用方法。

    宇航
  • SQL简体繁体转换函数代码

    用户1149182
  • 3 个适合新人上手的Python项目

    人生苦短,我用Python!废话不多说,今天给大家分享三个极实用的Python爬虫案例。

    昱良
  • 推荐几个适合新人上手的Python项目

    昱良
  • 推荐几个适合新人上手的Python项目

    非著名程序员
  • 一次夜维SQL的性能优化

    最近单位搬家,从国家会议中心,搬往空气清新的顺义后沙峪,搬迁之前的完结上线中,碰见了一些棘手的问题,有一些值得借鉴的地方。

    bisal
  • 私信基本功能数据库设计

    上一篇写了基于resin4.0+websocket实现私信功能服务端消息推送文章,趁热打铁,在写一篇关于私信功能的数据库设计文章,非代码篇,希望想对第一次做设计...

    哎_小羊
  • Linux系统fstab挂载分区不建议使用device ID

    /dev/disk/by-name 路径在 SUSE Linux Enterprise Server 11 包中已弃用,也不建议使用。

    党志强
  • python文件读写的基本操作(二)

    本系列课程是针对无基础的,争取用简单明了的语言来讲解,学习前需要具备基本的电脑操作能力,准备一个已安装python环境的电脑。如果觉得好可以分享转发,有问题的地...

    用户7054460

扫码关注云+社区

领取腾讯云代金券