项目中遇到一个问题,C/C++需要与JAVA通信,JAVA方已经使用了XML序列化传输。本可以考虑JSON/GOOGLE PROTOCOL BUFFER的,但为了使JAVA方不做过多改动,坚持使用XML。

JAVA中可以将object与xml互转,但C/C++中没有找到类似开源项目,自己实现不太现实,只能一步一步对xml进行解析和生成了。

tinyxml2库使用非常简单,代码中引用tinyxml2.h,编译时加入tinyxml2.cpp即可;实例程序中有简单的xml解析例子。

以下对java中list/map(转xml)进行了解析:

#include <stdio.h>
#include "tinyxml2.h"
using namespace std;
using namespace tinyxml2;
        int
main ()
{
        static const char *xml =
                "<BusinessTask>"
                "<taskId>415042210020001</taskId>"
                "<controlSysId>hyb-product</controlSysId>"
                "<gwAccount>324345543543</gwAccount>"
                "<serviceKey>ba827bcfba932953</serviceKey>"
                "<type>54354675</type>"
                "<resourceNum></resourceNum>"
                "<participants>"
                "<TaskItem>"
                "<role>1</role>"
                "<participant>123124342432</participant>"
                "<startTime>0</startTime>"
                "<endTime>0</endTime>"
                "<isFinished>false</isFinished>"
                "</TaskItem>"
                "<TaskItem>"
                "<role>2</role>"
                "<participant>54675764656</participant>"
                "<startTime>0</startTime>"
                "<endTime>0</endTime>"
                "<isFinished>false</isFinished>"
                "</TaskItem>"
                "</participants>"
                "<propertyMap>"
                "<entry>"
                "<string>resourceNum</string>"
                "<string>423424424</string>"
                "</entry>"
                "<entry>"
                "<string>userId</string>"
                "<string>564657657567</string>"
                "</entry>"
                "<entry>"
                "<string>maxRetryTimes</string>"
                "<string>0</string>"
                "</entry>"
                "</propertyMap>"
                "<beginTime>1429668120</beginTime>"
                "<extParam></extParam>" "</BusinessTask>";
        /*
         * static const char* xml =
         * "<?xml version=\"1.0\"?>"
         * "<!DOCTYPE PLAY SYSTEM \"play.dtd\">"
         * "<PLAY>"
         * "<TITLE>A Midsummer Night's Dream</TITLE>"
         * "</PLAY>";
         * */
        XMLDocument doc;
        doc.Parse (xml);
        if (doc.ErrorID () != 0)
        {
                fprintf (stderr, "parse error");
                exit (1);
        }
        XMLElement *partElement =
                doc.FirstChildElement ("BusinessTask")->
                FirstChildElement ("participants");
        XMLElement *taskitemElement = partElement->FirstChildElement ("TaskItem");
        while (taskitemElement)
        {
                int role = -1;
                XMLElement *roleElement = taskitemElement->FirstChildElement ("role");
                roleElement->QueryIntText (&role);
                fprintf (stdout, "role=%d\n", role);
                taskitemElement = taskitemElement->NextSiblingElement ();
        }
        XMLElement *propertyMapElement =
                doc.FirstChildElement ("BusinessTask")->FirstChildElement ("propertyMap");
        XMLElement *entryElement = propertyMapElement->FirstChildElement ("entry");
        while (entryElement)
        {
                XMLElement *stringElement = entryElement->FirstChildElement ();
                printf ("%s\n", stringElement->GetText ());
                stringElement = stringElement->NextSiblingElement ();
                printf ("%s\n", stringElement->GetText ());
                entryElement = entryElement->NextSiblingElement ();
        }         return 0;
}

以下是生成XML:

#include <stdio.h>
#include <string>
#include "tinyxml2.h"
using namespace std;
using namespace tinyxml2;
int main()
{
        //xml文档
        XMLDocument *pDoc = new XMLDocument();
        if (NULL==pDoc) {
                fprintf(stderr,"pDoc is null");
                exit(1);
        }         XMLElement* BusinessTask = pDoc->NewElement("BusinessTask");
        pDoc->LinkEndChild(BusinessTask);         XMLElement *taskIdElement = pDoc->NewElement("taskId");
        taskIdElement->LinkEndChild(pDoc->NewText("415042210020001"));//给节点设置值
        BusinessTask->LinkEndChild(taskIdElement);         XMLElement *controlSysIdElement = pDoc->NewElement("controlSysId");
        controlSysIdElement->LinkEndChild(pDoc->NewText("415042210020001"));//给节点设置值
        BusinessTask->LinkEndChild(controlSysIdElement);         XMLElement *typeElement = pDoc->NewElement("type");
        typeElement->LinkEndChild(pDoc->NewText("68720525312"));//给节点设置值
        BusinessTask->LinkEndChild(typeElement);         XMLElement *participantsElemet = pDoc->NewElement("participants");
        BusinessTask->LinkEndChild(participantsElemet);
        int i=0;
        for(i;i<3;i++)
        {
                XMLElement *TaskItemElemet = pDoc->NewElement("TaskItem");
                participantsElemet->LinkEndChild(TaskItemElemet);                 //role
                XMLElement *roleElement = pDoc->NewElement("role");
                roleElement->LinkEndChild(pDoc->NewText("1"));
                TaskItemElemet->LinkEndChild(roleElement);                 //participant
                XMLElement *participantElement = pDoc->NewElement("participant");
                participantElement->LinkEndChild(pDoc->NewText("13996130360"));
                TaskItemElemet->LinkEndChild(participantElement);
        }         //propertyMap
        XMLElement *propertyMapElemet = pDoc->NewElement("propertyMap");
        BusinessTask->LinkEndChild(propertyMapElemet);
        for(i=0;i<3;i++)
        {
                XMLElement *entryElemet = pDoc->NewElement("entry");
                propertyMapElemet->LinkEndChild(entryElemet);                 //key
                XMLElement *keyElement = pDoc->NewElement("string");
                keyElement->LinkEndChild(pDoc->NewText("resourceNum"));
                entryElemet->LinkEndChild(keyElement);                 //value
                XMLElement *valueElement = pDoc->NewElement("string");
                valueElement->LinkEndChild(pDoc->NewText("13996130361"));
                entryElemet->LinkEndChild(valueElement);         }         /*
           XMLPrinter printer;
           pDoc->Accept(&printer);
           char body[8192]={0x00};
           int len = strlen(printer.CStr());
           memcpy(body,printer.CStr(),8192);
           printf("len=%d\n%s\n",len,body);*/         pDoc->Print();//打印
        delete pDoc;
}

输出如下

415042210020001

415042210020001

68720525312

1

13996130361

1

13996130361

1

13996130361

resourceNum

13996130361

resourceNum

13996130361

resourceNum

13996130361

tinyxml2使用的更多相关文章

  1. TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏

    TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...

  2. tinyxml2简单使用

    引入头文件 <span style="font-size:18px;">#include "HelloWorldScene.h" #include ...

  3. cocos2d-x使用tinyxml2存储解析xml

    我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库. 导入头文件:#include "support/tinyxml2/tinyxml2.h" using nam ...

  4. TinyXml和tinyxml2

    C++操作xml没有标准库的支持,TinyXml是个不错的xml操作库,以前总是使用TinyXml读写xml,但是最近对大量xml进行读写时,速度真的是有点慢,特别是在调试时,每次启动读xml就要好长 ...

  5. 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml

     数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...

  6. 用TinyXml2读取XML文件的一个简单Demo

    废话少说直接上代码,需要的人自然一看便懂,对于第一次接触TinyXml2的人来说还是有帮助的. <?xml version="1.0"?> <Table name ...

  7. tinyxml2库的使用--MFC工程

    在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的ini文件是蛮好的选择,但是平台的通用性比较差,使用xml的话就比较强一点,但是解析比较复杂,型号有牛人已经开发出了直接读写xml的库, ...

  8. TinyXML2的使用

    -----------------------------------------------------------------2015年7月21日16:37:53----------------- ...

  9. 推荐一个优秀的c++源代码,TinyXml2

    项目主页:http://grinninglizard.com/tinyxml2docs/index.html tinyxml2.h /* Original code by Lee Thomason ( ...

  10. Windows10 VS2017 C++ xml解析(tinyxml2库)

    首先下载tinyxml2 7.0.1库: https://github.com/leethomason/tinyxml2/releases 打开tinyxml2,然后升级sdk,解决方案->重定 ...

随机推荐

  1. 01二维矩阵中最大全为1的正方形maxSquare——经典DP问题(二维)

    在一个二维01矩阵中找到全为1的最大正方形 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 以矩阵中每一个点作为正方形右下角点来处理,而以该点为右下角点的最大边长最多比 ...

  2. vertical-align属性测试实验面板 文字 图片对齐

    转自:http://www.zhangxinxu.com/study/201005/verticle-align-test-demo.html

  3. chrome hosts

    # Go Hosts# 2017-05-02 02:13:04# Localhost (DO NOT REMOVE)127.0.0.1    localhost::1    localhost ip6 ...

  4. laravel中的数据库迁移

    1.创建数据库迁移文件:生成数据库迁移文件,前面跟着时间戳: php artisan make:migration create_posts_table 创建数据库迁移文件:可以重命名数据表名: -- ...

  5. re随机模块应用-生成验证码(无图片)

    方法一,通过choice方式生成验证码 此方法生成每次调用crate_code()会生成三个随机数,然后再三个随机数中选择一个,资源调用相对多些 import random def v_code(co ...

  6. Win10系列:C#应用控件基础1

    Button控件 在Windows应用商店应用的开发中,Button控件是使用比较频繁的控件之一,当用户单击Button控件时,会触发相应的单击事件并在定义好的事件处理方法中执行指定的功能.下面将介绍 ...

  7. Uboot USB模式(RK3288变砖头的解决办法)

    RK3288启动后有三种模式,可以分别进行操作. 第一种是normal也就是正常的启动模式.这个模式无法刷固件.一般板子通电就是这个模式 第二种是loader模式.就是刷固件模式.这个模式可以刷各种i ...

  8. PyCharm进行远程开发和调试linux服务器

    简介: 或许我也应该迁移到linux环境去开发. 最近写的一些小东西,在wnidows上开发,在windows上调试,都很正常.可是一旦放进linux服务器,就歇菜了. 那么我们有什么办法处理这个wi ...

  9. Java:<获取>、<删除>指定文件夹及里面所有文件

    工具类代码如下: 一.获取 public Class Test{ //定义全局变量,存放所有文件夹下的文档 List<String> fileList ; public List<S ...

  10. vue-router-5-命名路由

    创建 Router 实例的时候,在 routes 配置中给某个路由设置名称 const router = new VueRouter({ routes: [ { path: '/user/:userI ...