• 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中的循环节点如何处理?

  • 相关阅读:
    剑指Offer——旋转数组的最小数字
    剑指Offer——用两个栈实现队列
    剑指Offer——从尾到头打印链表
    剑指Offer——替换空格
    剑指Offer——二维数组中的查找
    剑指Offer——数据流中的中位数
    剑指Offer——字符流中第一个不重复的字符
    剑指Offer——删除链表中重复的结点
    运维常用shell脚本
    log4cxx的使用
  • 原文地址:https://www.cnblogs.com/stupid-vincent/p/6523387.html
Copyright © 2020-2023  润新知