2009-06-23 2 views
1

Я столкнулся с тем, как преобразовать XML в JSON в ASP.NET C# (link) и один в javascript (at goessner.net/download/prj/jsonxml/). Но еще не найти один в C++, который принимает только строку в качестве входных данных (или узел tinyxml, когда я использую эту библиотеку).Как преобразовать XML в JSON в C++?

ответ

1

Просим обратить внимание на http://json.org. Там вы можете найти что-то интересное. В нем перечислены многие библиотеки, доступные для обработки JSON на C++ и многих других языках.

Но если вы связались с [pdhcc], вам, возможно, придется самому поработать, чтобы поместить его на C++.

1

В идеале это было бы сделано с использованием XSLT вместо написания переводчика в C++/C#. Вы можете найти некоторые решения онлайн (например, this one).

Однако, если вы предпочитаете делать это на C++, то я рекомендую библиотеку jsoncpp.

0

Я реализовал эту функцию, чтобы преобразовать XML в JSON с помощью jsoncpp & 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; 
} 
Смежные вопросы