我遇到了如何在ASP.NET C#(link)中将XML转换为JSON,在javascript中转换为jSON(在goessner.net/download/prj/jsonxml/中)。但是还没有在c ++中找到一个只需要一个字符串作为输入(或者是一个tinyxml节点,因为我正在使用该库)。
答案 0 :(得分:5)
到目前为止,唯一一个专门设计的C ++库,它直接将XML转换为我在互联网上找到的JSON xml2json:https://github.com/Cheedoong/xml2json
答案 1 :(得分:1)
请前往http://json.org。你可能会在那里找到感兴趣的东西。它列出了许多可用于C ++和许多其他语言的JSON处理的库。
但是对于你链接到[pdhcc]的东西,你可能需要自己做一些工作来将它移植到C ++。
答案 2 :(得分:1)
答案 3 :(得分:0)
你看过http://www.json.org/吗?
答案 4 :(得分:0)
我实现了这个函数,使用jsoncpp&将xml转换为json。 rapidxml库,也许会帮助别人。 编译:g ++ -o xmltojson main.cpp -ljsoncpp。 仅在debian 9上测试过。
#include <set>
#include <string>
#include <string.h>
#include <iostream>
#include <jsoncpp/json/json.h>
#include <rapidxml/rapidxml.hpp>
void parse_node_tree(const rapidxml::xml_node<>* node, Json::Value& parent)
{
Json::Value obj(Json::objectValue);
std::multiset<std::string> array;
for(rapidxml::xml_node<> *child = node->first_node(); child != nullptr; child = child->next_sibling())
{
if(child->type() != rapidxml::node_element)
continue;
array.insert(child->name());
}
if(node->value_size() > 0)
{
obj["#text"] = node->value();
}
bool hasChilds = false;
for(rapidxml::xml_attribute<> *attr = node->first_attribute(); attr != nullptr; attr = attr->next_attribute())
{
hasChilds = true;
obj[attr->name()] = attr->value();
}
for(rapidxml::xml_node<> *child = node->first_node(); child != nullptr; child = child->next_sibling())
{
if(child->type() != rapidxml::node_element)
continue;
hasChilds = true;
Json::Value& next = obj[child->name()];
if(array.count(child->name()) > 1 && !next.isArray())
{
next = Json::arrayValue;
}
parse_node_tree(child, next);
}
// set result.
if(parent.isArray())
{
parent.append(obj);
}
else
{
if(obj.isArray() || hasChilds)
parent = obj;
else
parent = node->value();
}
}
// convert xml string to json
std::string xmltojson(const std::string& xml)
{
char xml_text[xml.size()+1];
memset(xml_text, 0, xml.size());
strncpy(xml_text, xml.c_str(), xml.size());
xml_text[xml.size()] = '\0';
rapidxml::xml_document<> doc;
try
{
doc.parse<0>(xml_text);
}
catch(rapidxml::parse_error& exp)
{
std::cout << exp.what() << std::endl;
return std::string();
}
rapidxml::xml_node<> *node = doc.first_node();
if(node == nullptr)
return std::string();
Json::Value jdoc;
Json::Value& jroot = jdoc[node->name()];
parse_node_tree(node, jroot);
Json::FastWriter fast_writer;
return fast_writer.write(jdoc);
}
int main(int argc, char** argv)
{
// xml
std::string test_xml = "<anagrafica><testata><nomemercato id='007'>Mercato di test</nomemercato><data>Giovedi 18 dicembre 2003 16.05.29</data></testata><record><codice_cliente>5</codice_cliente><rag_soc>Miami American Cafe</rag_soc><codice_fiscale>IT07654930130</codice_fiscale><indirizzo tipo='casa'>Viale Carlo Espinasse 5, Como</indirizzo><num_prodotti>13</num_prodotti></record><record><codice_cliente>302</codice_cliente><rag_soc>Filiberto Gilardi</rag_soc><codice_fiscale>IT87654770157</codice_fiscale> <indirizzo tipo='ufficio'>Via Biancospini 20, Messina</indirizzo><num_prodotti>8</num_prodotti> </record><record><codice_cliente>1302</codice_cliente><rag_soc>Eidon</rag_soc><codice_fiscale>IT887511231</codice_fiscale><indirizzo tipo='ufficio'>Via Bassini 17/2, Milano</indirizzo><num_prodotti>18</num_prodotti> </record><record><codice_cliente>202</codice_cliente><rag_soc>SkillNet</rag_soc><codice_fiscale>IT887642131</codice_fiscale><indirizzo tipo='ufficio'>Via Chiasserini 11A, Milano</indirizzo><num_prodotti>24</num_prodotti></record><record><codice_cliente>12</codice_cliente><rag_soc>Eidon</rag_soc><codice_fiscale>IT04835710965</codice_fiscale><indirizzo tipo='casa'>Via Cignoli 17/2, Roma</indirizzo><num_prodotti>1112</num_prodotti></record><record><codice_cliente>5</codice_cliente><rag_soc>Miami American Cafe</rag_soc><codice_fiscale>IT07654930130</codice_fiscale><indirizzo tipo='casa'>Viale Carlo Espinasse 5, Como</indirizzo><num_prodotti>13</num_prodotti></record><record><codice_cliente>302</codice_cliente><rag_soc>Filiberto Gilardi</rag_soc><codice_fiscale>IT87654770157</codice_fiscale><indirizzo tipo='ufficio'>Via Biancospini 20, Messina</indirizzo><num_prodotti>8</num_prodotti></record><record><codice_cliente>1302</codice_cliente><rag_soc>Eidon</rag_soc><codice_fiscale>IT887511231</codice_fiscale><indirizzo tipo='ufficio'>Via Bassini 17/2, Milano</indirizzo><num_prodotti>18</num_prodotti></record><record><codice_cliente>202</codice_cliente><rag_soc>SkillNet</rag_soc><codice_fiscale>IT887642131</codice_fiscale><indirizzo tipo='ufficio'>Via Chiasserini 11A, Milano</indirizzo><num_prodotti>24</num_prodotti></record><record><codice_cliente>202</codice_cliente><rag_soc>SkillNet</rag_soc><codice_fiscale>IT887642131</codice_fiscale><indirizzo tipo='ufficio'>Via Chiasserini 11A, Milano</indirizzo><num_prodotti>24</num_prodotti></record><record><codice_cliente>12</codice_cliente><rag_soc>Eidon</rag_soc><codice_fiscale>IT04835710965</codice_fiscale><indirizzo tipo='casa'>Via Cignoli 17/2, Roma</indirizzo><num_prodotti>1112</num_prodotti></record></anagrafica>";
// convert
std::string json = xmltojson(test_xml);
// log
std::cout << test_xml << std::endl;
std::cout << std::endl;
std::cout << json << std::endl;
return 0;
}