#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. PAT Basic 1048

    1048 数字加密 本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余— ...

  2. DuiLib DirectUI 界面库

    国内首个开源 的directui 界面库,开放,共享,惠众,共赢,遵循bsd协议,可以免费用于商业项目,目前支持Windows 32 .Window CE.Mobile等平台. Duilib 是一款强 ...

  3. CSU-1803: 2016 ,同余定理!

    int main() {     int n,m;     while(~scanf("%d%d",&n,&m))     {         int r1=n/2 ...

  4. 自动化运维之shell通配符,转义符,和元字符(二)

    1 shell通配符 通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆.把通配符理解为shell特殊代号字符就可. 二.shell元字符 shell除了有通配符之外,由shel ...

  5. iOS学习小结(一)

    1.给类目添加属性需要使用runtime关联 #import <Foundation/Foundation.h> @interface NSURLRequest (AIFNetworkin ...

  6. 【基础操作】FFT / DWT / NTT / FWT 详解

    1. 2. 点值表示法 假设两个多项式相乘后得到的多项式 的次数(最高次项的幂数)为 $n$.(这个很好求,两个多项式的最高次项的幂数相加就得到了) 对于每个点,要用 $O(n)$ 的时间 把 $x$ ...

  7. 【2018.10.18】noip模拟赛Day2 地球危机(2018年第九届蓝桥杯C/C++A组省赛 三体攻击)

    题目描述 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 $A × B × C$ 艘战舰,在太 空中排成一个 $A$ 层 $B$ 行 $C$ 列的立方体.其中,第 $i$ 层第 $j$ 行第 $k ...

  8. 小机房的树(codevs 2370)

    题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...

  9. Log4j2异步情况下怎么防止丢日志的源码分析以及队列等待和拒绝策略分析

    org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor以下所有源码均在此类中首先我们看下log4j2异步队列的初始化 从这里面我们 ...

  10. Windows下ElasticSearch的使用方式 CURL+Cygwin+Head插件

    Windows使用ElasticSearch的命令方法 一.CURL(不推荐) 下载curl安装包,解压到指定目录,在命令行运行解压后的exe文件. 二.Cygwin(推荐) 安装Windows下类l ...