读取xml生成lua测试代码
来源:互联网 发布:王羽的大招笔记淘宝 编辑:程序博客网 时间:2024/06/04 05:16
#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 dataend
0 0
- 读取xml生成lua测试代码
- PHP读取MYSQL生成XML代码
- lua读取xml
- Lua动态生成代码
- 读取生成的xml
- 读取与生成XML
- xml读取和生成
- 分页生成读取xml
- 读取xml档测试
- 解析表格生成lua代码
- xml读取 数据库连接 生成xml 步骤详解及其代码和所需的包
- C#,读取Xml生成菜单
- jdom 生成读取xml数据
- C#,读取Xml生成菜单
- 读取 生成 格式化 XML 文件
- 代码生成XML
- 生成XMl文档代码
- 代码生成XML
- LeetCode122:Best Time to Buy and Sell Stock II
- LeetCode85 Maximal Rectangle java题解
- repcached配置与简单测试
- SQL Server 2008 R2占用内存越来越大两种解决方法
- android 随笔,代码片段
- 读取xml生成lua测试代码
- Bitmap内存优化--使用BitmapFactory.options及SoftReference解决OutOfMemory问题
- jquery,get方式提交中文数据时乱码
- iOS高级开发, 开机启动, 无限后台运行, 监听进程
- 统计一句话中有多少个单词,并分行打印。
- JVM调优总结 -Xms -Xmx -Xmn -Xss
- PHP面试题及答案
- 《Java程序设计》日志一
- Android图片压缩,先进行尺寸压缩,再质量压缩