tinyxml2使用
项目中遇到一个问题,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使用的更多相关文章
- TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏
TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...
- tinyxml2简单使用
引入头文件 <span style="font-size:18px;">#include "HelloWorldScene.h" #include ...
- cocos2d-x使用tinyxml2存储解析xml
我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库. 导入头文件:#include "support/tinyxml2/tinyxml2.h" using nam ...
- TinyXml和tinyxml2
C++操作xml没有标准库的支持,TinyXml是个不错的xml操作库,以前总是使用TinyXml读写xml,但是最近对大量xml进行读写时,速度真的是有点慢,特别是在调试时,每次启动读xml就要好长 ...
- 7.数据本地化CCString,CCArray,CCDictionary,tinyxml2,写入UserDefault.xml文件,操作xml,解析xml
数据本地化 A CCUserDefault 系统会在默认路径cocos2d-x-2.2.3\projects\Hello\proj.win32\Debug.win32下生成一个名为UserDef ...
- 用TinyXml2读取XML文件的一个简单Demo
废话少说直接上代码,需要的人自然一看便懂,对于第一次接触TinyXml2的人来说还是有帮助的. <?xml version="1.0"?> <Table name ...
- tinyxml2库的使用--MFC工程
在编写应用程序的时候,经常需要动态加载某些数据,这种情况下微软的ini文件是蛮好的选择,但是平台的通用性比较差,使用xml的话就比较强一点,但是解析比较复杂,型号有牛人已经开发出了直接读写xml的库, ...
- TinyXML2的使用
-----------------------------------------------------------------2015年7月21日16:37:53----------------- ...
- 推荐一个优秀的c++源代码,TinyXml2
项目主页:http://grinninglizard.com/tinyxml2docs/index.html tinyxml2.h /* Original code by Lee Thomason ( ...
- Windows10 VS2017 C++ xml解析(tinyxml2库)
首先下载tinyxml2 7.0.1库: https://github.com/leethomason/tinyxml2/releases 打开tinyxml2,然后升级sdk,解决方案->重定 ...
随机推荐
- Linux+Apache+MySQL+PHP配置教程
有时我们只想搭建LAMP环境做个测试,并不在意目录的和配置是否规范,本教程正是为此想法而写能简单的就不复杂实现最快地搭建LAMP:操作系统为CentOS6.5. 1.安装Apache yum inst ...
- [转]一次CMS GC问题排查过程(理解原理+读懂GC日志)
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...
- MINIUI应用
MINIUI是一款优秀的JS前端web框架,提供丰富.强大控件库,能快速开发企业级Web应用软件. 属于付费插件. 如果有兴趣推荐去这个网址看看.MiniUI 在线示例 http://www.min ...
- Linux下使用date命令查看和修改时间
1.查看系统时区和时间,执行命令date -R “-0500”代表西五区(America/New_York),北京的时区为“+0800”(东八区). 2.查看硬件时间,执行命令hwclock --sh ...
- laravel 连表查询数据库
$this->model ->select($field) ->leftJoin('b', 'b.cid', '=', 'a.id') ->orderBy("a.ad ...
- set循环遍历删除特定元素
使用Iterator迭代器 public class Demo { public static void main(String[] args) { Set<Object> obj = n ...
- :模板方法模式:Beverage
#ifndef __COFFINEBEVERAGE_H__ #define __COFFINEBEVERAGE_H__ #include <iostream> using namespac ...
- 8.4 C++标准输入流
参考:http://www.weixueyuan.net/view/6410.html 总结: 所谓标准输入是指从标准输入设备中输入设备,通常来讲我们可以将标准输入设备理解为键盘. cin是标准输入类 ...
- Docker(2):快速入门及常用命令
什么是Docker? Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行和管理 ...
- codeforce949A(顺带vector详细使用介绍)
A. Zebras time limit per test1 second memory limit per test512 megabytes inputstandard input outputs ...