json转xml

#include    <stdio.h>
#include    <string.h>
#include    <stdlib.h>
#include    <sys/stat.h>

#include    <libxml/xmlmemory.h>
#include    <libxml/parser.h>

#include    "cJSON.h"

void json_loop(cJSON* json_root, xmlNodePtr xml_root)
{
    int        count, i;
    cJSON    *json_cur = json_root, *json_node;    
    xmlNodePtr    xml_node;
    xmlNodePtr    xml_content;

    for(json_cur = json_root; json_cur; json_cur = json_cur->next)
    {
        count = cJSON_GetArraySize(json_cur);
        if(0 == count)
        {
            fprintf(stdout, "value:[%s]
", json_cur->valuestring);
            xml_node = xmlNewNode(NULL, json_cur->string);
            xml_content = xmlNewText(json_cur->valuestring);
            xmlAddChild(xml_node, xml_content);
            xmlAddChild(xml_root, xml_node);
            continue;    
        }
        else
        {
            if(NULL == json_cur->string)
                fprintf(stdout, "loop
");
            else
            {
                xml_node = xmlNewNode(NULL, json_cur->string);
                json_loop(json_cur->child, xml_node);
                xmlAddChild(xml_root, xml_node);
            }
        }
    }
}

int main(int argc, char* argv[])
{
    char    filename[1024], line[1024], *data;    
    FILE    *fp = NULL;
    struct    stat st;
    xmlDocPtr    xml_doc;
    xmlNodePtr    xml_root;    

    if(1 >= argc)
    {
        fprintf(stderr, "usage:%s filename
", argv[0]);
        return -1;
    }
    memset(filename, 0, sizeof(filename));
    strcpy(filename, argv[1]);
    
    if(NULL == (fp = fopen(filename, "r")))
    {
        fprintf(stderr, "open file [%s] failed!
", filename);
        return -1;
    }
    memset(&st, 0, sizeof(st));
    stat(filename, &st);    
    data = (char*)malloc(st.st_size + 1);
    memset(data, 0, st.st_size + 1);
    memset(line, 0, sizeof(line));
    while(fgets(line, sizeof(line) - 1, fp))
    {
        strncpy(data + strlen(data), line, strlen(line));
        memset(line, 0, sizeof(line));
    }
    fclose(fp);

    cJSON    *json_root = cJSON_Parse(data);    
    char    *json_data = cJSON_Print(json_root);
    fprintf(stdout, "JSON:
%s
", json_data);
    free(json_data);
    
    xmlBufferPtr    buff = xmlBufferCreate();
    xml_doc = xmlNewDoc(BAD_CAST"1.0");
    xml_root = xmlNewNode(NULL, json_root->child->string);
    fprintf(stdout, "xml_root:[%s]
", xml_root->name);
    xmlDocSetRootElement(xml_doc, xml_root);    
    json_loop(json_root->child->child, xml_root);        
    
    xmlChar*    dump;
    int            size;
    xmlDocDumpFormatMemory( xml_doc, &dump, &size, 1 );
    xmlBufferEmpty( buff );
    xmlBufferAdd( buff, dump, size );
    xmlFree( dump );    
    fprintf(stdout, "-------------------------------------
");
    fprintf(stdout, "XML:
%s
", xmlBufferContent(buff));
    xmlBufferFree(buff);
    xmlFreeDoc(xml_doc);

    cJSON_Delete(json_root);
    return 0;
    
}

问题:JSON中的循环节点如何处理?

原文地址:https://www.cnblogs.com/stupid-vincent/p/6523387.html