xml转json

1、cJSON

cJSON.h cJSON.c(查看文件)

2、libxml2

代码如下:

#include    <stdlib.h>
#include    <string.h>
#include    <stdio.h>

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

#include    "cJSON.h"

xmlNodePtr    parseDoc(const char* docname)
{
    xmlDocPtr    doc;
    xmlNodePtr    cur;

    xmlKeepBlanksDefault(0);
    doc = xmlParseFile(docname);
    if(NULL == doc)
    {
        fprintf(stderr, "Document parsed failed!\n");
        return NULL;
    }

    cur = xmlDocGetRootElement(doc);
    if(NULL == cur)
    {
        fprintf(stderr, "Document is empty!\n");
        xmlFreeDoc(doc);
        return NULL;
    }    

    return cur;
}

void    printXmlChildren(xmlNodePtr xml_root)
{
    xmlNodePtr    cur = NULL;
    for(cur = xml_root; cur; cur = cur->next)
    {
        if(cur->type == XML_ELEMENT_NODE)
        {
            if(cur->children->type == XML_TEXT_NODE)
                fprintf(stdout, "NODE:[%s][%s]\n", cur->name, xmlNodeGetContent(cur));
            else if(cur->children->type == XML_ELEMENT_NODE)
            {
                fprintf(stdout, "NODE:[%s]\n", cur->name);
                printXmlChildren(cur->children);
            }
        }
    }

    return ;
}

void    xml2json(xmlNodePtr xml_root, cJSON** json_root)
{
    xmlNodePtr    xml_cur = NULL;
    cJSON        *json_cur = NULL;

    for(xml_cur = xml_root; xml_cur; xml_cur = xml_cur->next)
    {
        if(xml_cur->type == XML_ELEMENT_NODE)
        {
            if(xml_cur->children->type == XML_TEXT_NODE)
            {
//            fprintf(stdout, "1--->[%s]\n", xml_cur->name);
                json_cur = cJSON_CreateString(xmlNodeGetContent(xml_cur));
                cJSON_AddItemToObject(*json_root, xml_cur->name, json_cur);
            }
            else if(xml_cur->children->type == XML_ELEMENT_NODE)
            {
//            fprintf(stdout, "2--->[%s]\n", xml_cur->name);
                json_cur = cJSON_CreateObject();
                cJSON_AddItemToObject(*json_root, xml_cur->name, json_cur);
                xml2json(xml_cur->children, &json_cur);
            }
        }
    }

    return ;
}

int main(int argc, char* argv[])
{
    char*    docname;
    xmlNodePtr    xml_root;

    if(1 >= argc)
    {
        fprintf(stderr, "Usage:%s docname!\n", argv[0]);
        return -1;
    }    

    docname = argv[1];
    if(NULL == (xml_root = parseDoc(docname)))
    {
        fprintf(stderr, "解析XML数据失败\n");
        return -1;
    }

    printXmlChildren(xml_root);

    fprintf(stdout, "-------------------------------------\n");
    cJSON*    json_root = cJSON_CreateObject();
    xml2json(xml_root, &json_root);

    fprintf(stdout, "JSON:\n[%s]\n", cJSON_Print(json_root));
    fprintf(stdout, "-------------------------------------\n");
    return ;
}

运行结果:

存在问题:

1、JSON数据的格式,无法判断整数等其他数据格式

2、XML循环数据的处理,XML循环数据转换后应该是带中括号的

时间: 2024-08-11 05:43:41

xml转json的相关文章

WebApi接口 - 响应输出xml和json

格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点赞谢谢: . 自定义一个Action,响应输出集合数据 . api返回json数据的两种方式 . json时间格式处理方式 . 让api接口支持返回json和xml数据 下面一步一个脚印的来分享: . 自定义一个Action,响应输出集合数据 首先,我们新建一个webapi项目,新建好以后我们能够找

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

XML和JSON比较

目前,在web开发领域,主要的数据交换格式有XML和JSON,对于XML相信每一个web developer都不会感到陌生:相比之下,JSON可能对于一些新步入开发领域的新手会感到有些陌生,也可能你之前已经听说过,但对于XML和 JSON的不同之处可能会不怎么了解.对于在 Ajax开发中,是选择XML还是JSON,一直存在着争议,个人还是比较倾向于JSON的,虽然JSON才处于起步阶段,但我相信JSON最终会取代XML成为Ajax的首选,到时Ajax可能要更名为Ajaj(Asynchronous

两种接口传送数据协议(xml和json)

规范性接口开发中,一般数据是以json或者xml的格式传送的,而不是字符串的形式直接返回给接口调用者:下面介绍这两种格式的编写方法. 下面两种数据传送方式是接口输出端的编写.需引入的包如下: <span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.io.PrintWriter; importjava.io.StringWriter; importjavax.servlet.http.HttpServ

C/C++使用libcurl库发送http请求(get和post可以用于请求html信息,也可以请求xml和json等串)

C++要实现http网络连接,需要借助第三方库,libcurl使用起来还是很方便的 环境:win32 + vs2015 如果要在Linux下使用,基本同理 1,下载编译libcurl 下载curl源码,找到vs工程,按照x86 x64 并对应debug和release编译出静态库lib 2,构建工程 1)curl头文件和lib拷贝到工程目录 2)配置附加包含目录libcurl中的include和附加库目录libcurl中的lib目录 3)添加预编译宏USE_OPENSSL和CURL_STATIC

C#中XML和json互相转换

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml; using Newtonsoft;//此方法需单独下载 namespace ThumbsLotteryTicket.MyMethond { public class XML_JSON { /// <summary> /// 返回指定节点下信息的JSON格式字符串 /// </summa

XStream解析xml和json

XStream是一个在我看来比较好的一个第三方包了.因为它在解析时支持注解.这样很是方便,并且xml跟json这两种格式的文件都能进行解析,XStream本属于java的一个第三方包,甚是好用,若是拿它在android开发环境,也是能正常解析,但有点美中不足,因为android开发环境时,XStream不太支持json转对象,只支持对象转json,其他xml与对象的互转都支持.这样的话双解析就有了那么一点瑕疵之处,不过话说回来,没多少需求的数据交互会用json跟xml切来切去的,当只是json转

ASP.NET中XML转JSON的方法

原文:ASP.NET中XML转JSON的方法 许多应用程序都将数据存储为XML的格式,而且会将数据以JSON的格式发送到客户端以做进一步处理.要实现这一点,它们必须将XML格式转换为JSON格式. XML转JSON代码 [csharp] view plaincopy private static string XmlToJSON(XmlDocument xmlDoc) { StringBuilder sbJSON = new StringBuilder(); sbJSON.Append("{ &

将场景导出XML或JSON或二进制并且解析还原场景

导出unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平移与Prefab的名称导出在XML与JSON中.然后解析刚刚导出的XML或JSON通过脚本把导出的游戏场景还原.在Unity官网上下载随便下载一个demo Project,如下图所示这是我刚刚在官网上下载的一个范例程序. 接着将层次视图中的所有游戏对象都封装成Prefab保存在资源路径中,这里注意一下如果你的Prefab绑定的脚本中有public Object 的话 ,需要在代码中

XML与JSON

在我们做各个系统和各个服务端的数据交互的时候会遇到其中两种数据格式,那就是xml和json,下面来谈谈这两种数据模式. XML 什么是xml? XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分. 您可以创建内容,然后使用限定标记标记它,从而使每个单词.短语或块成为可识别.可分类的信息.您创建的文件,或文档实例 由元素(标记)和内容构成.元素的描述性越强,文档各部分越容易识别. 构建XML          1.XML