Как конвертировать XML в JSON в C ++? - PullRequest
1 голос
/ 23 июня 2009

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

Ответы [ 5 ]

5 голосов
/ 27 ноября 2013

На данный момент единственной специально разработанной библиотекой C ++, которая напрямую преобразует XML в JSON, которую я нашел в Интернете, является xml2json : https://github.com/Cheedoong/xml2json

1 голос
/ 23 июня 2009

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

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

1 голос
/ 23 июня 2009

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

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

0 голосов
/ 19 сентября 2017

Я реализовал эту функцию для преобразования 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;
}
0 голосов
/ 23 июня 2009

Вы смотрели на http://www.json.org/?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...