#include <iostream>
#include <string>
#include <fstream>
#include "tinyxml2.h"
using namespace std;
using namespace tinyxml2; std::ofstream file("test.lua",std::ios::ate|std::ios::binary); void read_ElementChild(XMLElement *surface)
{
string punStr = ","; //标点符号
file << "\t\t";
bool isArray = true; //是否是循环
while (surface) {
const XMLAttribute *attr = surface->FirstAttribute();
string strType; while (attr) {
if ( strcmp(attr->Name(), "name") == 0 ){
string name = attr->Value();
string preStr = name + " = ";
string preStr1 = name + " = { ";
string temp; if ( strcmp(strType.c_str(), "String") == 0 ){
isArray = false;
temp = "\"呵呵00001\"" + punStr;
}else if(strcmp(strType.c_str(), "long")==0){
isArray = false;
temp = "100" + punStr;
}else if(strcmp(strType.c_str(), "int")==0){
isArray = false;
temp = "10" + punStr;
}else if(strcmp(strType.c_str(), "short")==0){
isArray = false;
temp = "10" + punStr;
}else if(strcmp(strType.c_str(), "byte")==0){
isArray = false;
temp = "2" + punStr;
}else if(strcmp(strType.c_str(), "boolean")==0){
isArray = false;
temp = "true" + punStr;
}else if(strcmp(strType.c_str(), "float")==0){
isArray = false;
temp = "2" + punStr;
}else{
if (!isArray){ //假设上次不是循环 这次是循环 换一行 并加入两个tab键空格
file << endl;
file << "\t\t" ;
}
isArray = true;
size_t len = strType.size();
string lastStr = strType.substr(len-2, 2);
if ( strcmp(lastStr.c_str(), "[]" ) == 0 ){
string preStr = strType.substr(0, len-2);
if ( strcmp(preStr.c_str(), "String") == 0 ){
temp = "\"呵呵00001\"" + punStr + " }" + punStr;
}else if( strcmp(preStr.c_str(), "long")==0){
temp = "100" + punStr + " }" + punStr;
}else if( strcmp(preStr.c_str(), "int")==0){
temp = "10" + punStr + " }" + punStr;
}else if( strcmp(preStr.c_str(), "short")==0){
temp = "10" + punStr + " }" + punStr;
}else if( strcmp(preStr.c_str(), "byte")==0){
temp = "2" + punStr + " }" + punStr;
}else if( strcmp(preStr.c_str(), "boolean")==0){
temp = "true" + punStr + " }" + punStr;
}else if( strcmp(preStr.c_str(), "float")==0){
temp = "2" + punStr + " }" + punStr;
}else {
temp = "{ read_" + preStr + " }, }" + punStr;
} temp = "[1]=" + temp; //数组加入[1]
}else{ //处理不是数组 读取别的协议 temp = " read_" + strType + " }" + punStr;
}
} if (isArray) {
file << preStr1 + temp;
}else {
file << preStr + temp;
}
}else if ( strcmp(attr->Name(), "type") == 0 ){
strType = attr->Value();
} attr = attr->Next(); //下一个属性
} surface = surface->NextSiblingElement(); //下一个节点
if (isArray && surface != NULL) //处理最后一行假设是数组 不空出一行
{
file << endl;
file << "\t\t";
}
}
file << endl;
file << "\t}" << endl; } void read_xml(XMLElement *surface)
{
while (surface) {
const XMLAttribute *attr = surface->FirstAttribute();
string name;
bool isRead = true; //假设是 C_ 协议就不继续读取了
while (attr) {
if ( strcmp(attr->Name(), "name") == 0 )
{
name = attr->Value();
string fristStr = name.substr(0,1);
string writeStr;
if ( strcmp(fristStr.c_str(), "S") == 0 )
{
writeStr = "function read_" + name + "()";
}else{
isRead = false;
break;
}
file << writeStr;
}else if ( strcmp(attr->Name(), "description") == 0 )
{
file << " --" << attr->Value() << endl;
}
attr = attr->Next();
} if (! isRead) {//假设是 C_ 协议就不继续读取了
surface = surface->NextSiblingElement();
continue;
} XMLElement *surface1 = surface->FirstChildElement(); //读取子节点
if (surface1){
file << "\tlocal data = {" << endl;
read_ElementChild(surface1);
} file << "end" << endl;
file << endl;
surface = surface->NextSiblingElement();
}
} int main(int argc, const char * argv[])
{
tinyxml2::XMLDocument myDocument;
myDocument.LoadFile("protocol.xml");
XMLElement *rootElement = myDocument.RootElement();
XMLElement *surface = rootElement->FirstChildElement("message");
read_xml(surface); return 0;
}

xml測试数据

<project name="Protocol">
<message id="0x42001003" name="S_CROSS_ARENA_UI" description="跨服争霸场角色信息">
<field type="S_CROSS_ARENA_ROLE_INFO[]" name="roleList" description="角色列表"/>
<field type="S_CROSS_ROLE_TOP_THREE_INFO[]" name="topThreeRoles" description="前三名"/>
<field type="int" name="fightCap" description="战斗力"/>
<field type="int" name="rankNo" description="排名"/>
<field type="int" name="leftAttackCount" description="剩余战斗攻击次数"/>
<field type="int" name="leftFreeResetCount" description="剩余免费重置次数"/>
<field type="long" name="resetExpend" description="添加战斗次数消耗钻石数"/>
<field type="long" name="addAttackExpend" description="添加战斗次数消耗钻石数"/>
<field type="S_CROSS_ROLE_TOP_THREE" name="test" description="消耗"/>
<field type="int" name="score" description="积分"/>
<field type="boolean[]" name="gradeRewards" description="三个档次的奖励是否可领取"/>
</message>
</project>

生成lua

function read_S_CROSS_ARENA_UI(self)  --跨服争霸场角色信息
local data = {
roleList = { [1]={ read_S_CROSS_ARENA_ROLE_INFO }, },
topThreeRoles = { [1]={ read_S_CROSS_ROLE_TOP_THREE_INFO }, },
fightCap = 10,rankNo = 10,leftAttackCount = 10,leftFreeResetCount = 10,resetExpend = 100,addAttackExpend = 100,
test = { read_S_CROSS_ROLE_TOP_THREE },
score = 10,
gradeRewards = { [1]=true, },
}
end

使用方法。用里面的标示,找到其它的协议把里面的内容复制过来.

也能够用函数返回方式。生成代码这样:

function read_S_CROSS_ARENA_UI()  --跨服争霸场角色信息
local data = {
roleList = { [1]= read_S_CROSS_ARENA_ROLE_INFO(), },
topThreeRoles = { [1]= read_S_CROSS_ROLE_TOP_THREE_INFO(), },
fightCap = 10,rankNo = 10,leftAttackCount = 10,leftFreeResetCount = 10,resetExpend = 100,addAttackExpend = 100,
test = read_S_CROSS_ROLE_TOP_THREE(),
score = 10,
gradeRewards = { [1]=true, },
}
return data
end

读取xml生成lua測试代码的更多相关文章

  1. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完毕測试代码)

    MD5和RSA是网络传输中最经常使用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,仅仅能加密而不能解密. ...

  2. maven多module项目中千万不要引入其它模块的单元測试代码

    本文出处:http://blog.csdn.net/chaijunkun/article/details/35796335,转载请注明. 因为本人不定期会整理相关博文,会对对应内容作出完好. 因此强烈 ...

  3. 基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)

    转载请标明出处. 在分布式系统中,常常会出现须要竞争同一资源的情况,本代码基于redis3.0.1+jedis2.7.1实现了分布式锁. redis集群的搭建,请见我的另外一篇文章:<>& ...

  4. Tensorflow MNIST 数据集測试代码入门

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50614444 測试代码已上传至GitH ...

  5. OpenFace库(Tadas Baltrusaitis)中基于Haar Cascade Classifiers进行人脸检測的測试代码

    Tadas Baltrusaitis的OpenFace是一个开源的面部行为分析工具.它的源代码能够从 https://github.com/TadasBaltrusaitis/OpenFace 下载. ...

  6. DIV旋转的測试代码

    <html> <head> <style type="text/css"> .rat0 { -webkit-transform: rotate( ...

  7. Testng 的数据源 驱动測试 代码与配置

    JUnit中有讲述使用注解的方式进行数据源读取进行自己主动循环測试的方法,在TestNG中也提供了对应的方法 public class TestngDataProvider { /** * 数组内的每 ...

  8. 基于webrtc的媒体库測试代码以及接口介绍

    经过一段时间的项目验证,第一版接口能够定版了.满足一般的项目需求是没有问题了,接口非常清晰,凝视也写的非常清晰,大家有须要的就拿去測试吧,android版本号还在验证中.假设有什么问题或者须要源码.能 ...

  9. MongoDB之Java測试代码(DAO层)

    MongoInit.java是数据库初始化及连接类 MongoUtils.java是对mongodb的各种操作方法 MongoInit.java package com.wlwcloud.datate ...

随机推荐

  1. LeetCode(121) Best Time to Buy and Sell Stock

    题目 Say you have an array for which the ith element is the price of a given stock on day i. If you we ...

  2. 每周一题 3n+1问题

    3n+1问题 #include<iostream> #include<math.h> #include<map> using namespace std; map& ...

  3. PAT Basic 1023

    1023 组个最小数 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5,一个8,我们得到的最小 ...

  4. PAT Basic 1018

    1018 锤子剪刀布 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输 ...

  5. 【SaltStack】一些常用模块举例

    一.用户和用户组模块 说明:该sls文件用来在Minion端创建nginx用户和nginx用户组,当创建nginx用户时,对nginx用户组是否已存在做判断! (1)  /srv/salt/creat ...

  6. div+css居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. [工具使用] visualvm 通过jmx不能连接

    远程服务器,通常配置下jmx,然后用visualvm连接然后监控. 但昨天自己的一台测试服务器上,正确配置了jmx还是不能连接上去. 后来参考了 https://bjddd192.github.io/ ...

  8. Python第三方库之openpyxl(12)

    Python第三方库之openpyxl(12) 地面天气图 在工作表上的列或行中安排的数据可以在一个表中绘制.当您想要在两组数据之间找到最佳组合时,一个表面图表是有用的.正如在地形图中一样,颜色和图案 ...

  9. system sys,sysoper sysdba 的区别

    --===================================== -- system sys,sysoper sysdba 的区别 --========================= ...

  10. Axure:从简单搜索到联想搜索的部件制作

    导读:最近一直都在整理原型部件,要说准备的最有感触的,当属搜索框无疑.搜索框的整理,前后加起来共耗时两天多.从最开始的按钮和文本框,到后来的图示,提示和联想查询.耗费了不少的心血,有必要总结一下,留个 ...