#include "tinyxml.h" #include void LuaXML_ParseNode (lua_State *L,TiXmlNode* pNode) { PROFILE 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) { PROFILE 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); }