Lua_绑定tinyxml到Lua中解析XML
2015-07-18 21:15
489 查看
// XMLHelper.h class lua_State; // register parser functions to lua void RegisterLuaXML(lua_State *L);
//XMLHelper.cpp #include "tinyxml.h" extern "C" { #include "lua.h" #include "lauxlib.h" #include "lualib.h" } void LuaXML_ParseNode (lua_State *L,TiXmlNode* pNode) { if (!pNode) return; // resize stack if neccessary luaL_checkstack(L, 5, "LuaXML_ParseNode : recursion too deep"); TiXmlElement* pElem = pNode->ToElement(); if (pElem) { // element name lua_pushstring(L,"name"); lua_pushstring(L,pElem->Value()); lua_settable(L,-3); // parse attributes TiXmlAttribute* pAttr = pElem->FirstAttribute(); if (pAttr) { lua_pushstring(L,"attr"); lua_newtable(L); for (;pAttr;pAttr = pAttr->Next()) { lua_pushstring(L,pAttr->Name()); lua_pushstring(L,pAttr->Value()); lua_settable(L,-3); } lua_settable(L,-3); } } // children TiXmlNode *pChild = pNode->FirstChild(); if (pChild) { int iChildCount = 0; for(;pChild;pChild = pChild->NextSibling()) { switch (pChild->Type()) { case TiXmlNode::DOCUMENT: break; case TiXmlNode::ELEMENT: // normal element, parse recursive lua_newtable(L); LuaXML_ParseNode(L,pChild); lua_rawseti(L,-2,++iChildCount); break; case TiXmlNode::COMMENT: break; case TiXmlNode::TEXT: // plaintext, push raw lua_pushstring(L,pChild->Value()); lua_rawseti(L,-2,++iChildCount); break; case TiXmlNode::DECLARATION: break; case TiXmlNode::UNKNOWN: break; }; } lua_pushstring(L,"n"); lua_pushnumber(L,iChildCount); lua_settable(L,-3); } } static int LuaXML_ParseFile (lua_State *L) { const char* sFileName = luaL_checkstring(L,1); TiXmlDocument doc(sFileName); doc.LoadFile(); lua_newtable(L); LuaXML_ParseNode(L,&doc); return 1; } void RegisterLuaXML (lua_State *L) { lua_register(L,"LuaXML_ParseFile",LuaXML_ParseFile); }
1.RegisterLuaXML 注册一个函数到lua函数映射表中
2.lua中调用LuaXML_ParserFile来解析xml表格
3.lua_settable(L,-3)弹出key、value,设置到table中。
lua中使用方法:
1.在Lua中直接写明 LuaXML_ParseFile("xx/xx/xx.xml")就可以了。
2."xx/xx/xx.xml"会被压入栈的顶端,同时LuaXML_ParseFile中调用luaL_checkstring(L,1)即可获得字符串.
3.LuaXML_ParseFile直接返回一个解析好的table
For Lua 5.0:
From: Robert Noll
Just a plain "Parse File to lua array" function in c++, using the [TinyXML]
(2.4.3) lib.
把TinyXML压缩包下载完成后,解压,把其中的.h和.cpp文件拷贝到工程中,编译即可。
相关文章推荐
- Lua_获取文件扩展名
- Order of evaluation
- Lua语言中字符串String实现原理
- Lua模拟类,继承,私密
- lua处理PHP序列化过后的数据为table
- 【Lua正则表达式】解析匹配优酷电视剧集的下载地址用来批量下载
- lua实现类的继承
- lua面向对象编程中冒号与点号的区别
- Codeforces Round #276 (Div. 2) B. Valuable Resources 二分
- Lua中的元表和元方法
- lua语法特性(一)
- lua三底漆:lua转让c/c++库(动态链接模式)
- lua语言实现面向对象编程
- lua和c的交互
- [Lua]Lua高级教程Metatables
- [LeetCode]Evaluate Reverse Polish Notation
- vs插件 BabelLua的使用
- Lua for学习
- lua 首次编译
- Lua查找表元素过程(元表、__index方法是如何工作的)