Ah sorry my fault… didn’t look to much at it.
Then I would declare the newNode function local like this:
--------------------------------------------------------------------------------- --------------------------------------------------------------------------------- -- -- xml.lua - XML parser for use with the Corona SDK. -- -- version: 1.2 -- -- CHANGELOG: -- -- 1.2 - Created new structure for returned table -- 1.1 - Fixed base directory issue with the loadFile() function. -- -- NOTE: This is a modified version of Alexander Makeev's Lua-only XML parser -- found here: http://lua-users.org/wiki/LuaXml -- --------------------------------------------------------------------------------- --------------------------------------------------------------------------------- local \_M = {} local newNode function \_M.newParser() XmlParser = {}; function XmlParser:ToXmlString(value) value = string.gsub(value, "&", "&"); -- '&' -\> "&" value = string.gsub(value, "\<", "<"); -- '\<' -\> "<" value = string.gsub(value, "\>", ">"); -- '\>' -\> ">" value = string.gsub(value, "\"", """); -- '"' -\> """ value = string.gsub(value, "([^%w%&%;%p%\t%])", function(c) return string.format("&#x%X;", string.byte(c)) end); return value; end function XmlParser:FromXmlString(value) value = string.gsub(value, "&#x([%x]+)%;", function(h) return string.char(tonumber(h, 16)) end); value = string.gsub(value, "&#([0-9]+)%;", function(h) return string.char(tonumber(h, 10)) end); value = string.gsub(value, """, "\""); value = string.gsub(value, "'", "'"); value = string.gsub(value, ">", "\>"); value = string.gsub(value, "<", "\<"); value = string.gsub(value, "&", "&"); return value; end function XmlParser:ParseArgs(node, s) string.gsub(s, "(%w+)=([\"'])(.-)%2", function(w, \_, a) node:addProperty(w, self:FromXmlString(a)) end) end function XmlParser:ParseXmlText(xmlText) local stack = {} local top = newNode() table.insert(stack, top) local ni, c, label, xarg, empty local i, j = 1, 1 while true do ni, j, c, label, xarg, empty = string.find(xmlText, "\<(%/?)([%w\_:]+)(.-)(%/?)\>", i) if not ni then break end local text = string.sub(xmlText, i, ni - 1); if not string.find(text, "^%s\*$") then local lVal = (top:value() or "") .. self:FromXmlString(text) stack[#stack]:setValue(lVal) end if empty == "/" then -- empty element tag local lNode = newNode(label) self:ParseArgs(lNode, xarg) top:addChild(lNode) elseif c == "" then -- start tag local lNode = newNode(label) self:ParseArgs(lNode, xarg) table.insert(stack, lNode) top = lNode else -- end tag local toclose = table.remove(stack) -- remove top top = stack[#stack] if #stack \< 1 then error("XmlParser: nothing to close with " .. label) end if toclose:name() ~= label then error("XmlParser: trying to close " .. toclose.name .. " with " .. label) end top:addChild(toclose) end i = j + 1 end local text = string.sub(xmlText, i); if #stack \> 1 then error("XmlParser: unclosed " .. stack[#stack]:name()) end return top end function XmlParser:loadFile(xmlFilename, base) if not base then base = system.ResourceDirectory end local path = system.pathForFile(xmlFilename, base) local hFile, err = io.open(path, "r"); if hFile and not err then local xmlText = hFile:read("\*a"); -- read file content io.close(hFile); return self:ParseXmlText(xmlText), nil; else print(err) return nil end end return XmlParser end newNode = function (name) local node = {} node.\_\_\_value = nil node.\_\_\_name = name node.\_\_\_children = {} node.\_\_\_props = {} function node:value() return self.\_\_\_value end function node:setValue(val) self.\_\_\_value = val end function node:name() return self.\_\_\_name end function node:setName(name) self.\_\_\_name = name end function node:children() return self.\_\_\_children end function node:numChildren() return #self.\_\_\_children end function node:addChild(child) if self[child:name()] ~= nil then if type(self[child:name()].name) == "function" then local tempTable = {} table.insert(tempTable, self[child:name()]) self[child:name()] = tempTable end table.insert(self[child:name()], child) else self[child:name()] = child end table.insert(self.\_\_\_children, child) end function node:properties() return self.\_\_\_props end function node:numProperties() return #self.\_\_\_props end function node:addProperty(name, value) local lName = "@" .. name if self[lName] ~= nil then if type(self[lName]) == "string" then local tempTable = {} table.insert(tempTable, self[lName]) self[lName] = tempTable end table.insert(self[lName], value) else self[lName] = value end table.insert(self.\_\_\_props, { name = name, value = self[name] }) end return node end return \_M