1. 程式人生 > 其它 >將lua資料表格 轉換成json格式,xml格式

將lua資料表格 轉換成json格式,xml格式

技術標籤:jsonxmllua

首先轉換成json,不廢話直接程式碼:


    local temp = require(tableName)
    local function table2json(t)
        --將表格轉換為json
        local function serialize(tbl)
            local tmp = {}
            for k, v in pairs(tbl) do
                local k_type = type(k)
                local v_type = type(v)
                local key = (k_type == "string" and "\"" .. k .. "\":") or (k_type == "number" and "")
                local value = (v_type == "table" and serialize(v)) or (v_type == "boolean" and tostring(v)) or (v_type == "string" and "\"" .. v .. "\"") or (v_type == "number" and v)
                tmp[#tmp + 1] = key and value and tostring(key) .. tostring(value) or nil
            end
            if table.maxn(tbl) == 0 then
                return "{" .. table.concat(tmp, ",") .. "}"
            else
                return "[" .. table.concat(tmp, ",") .. "]"
            end
        end
        assert(type(t) == "table")
        return serialize(t)
    end
    local function appendFile(fileName, content)
        local f = assert(io.open(fileName, 'w'))
        f:write(content)
        f:close()
    end
    appendFile('itemtable.json', table2json(temp))--temp就是要轉換的資料




接下來是轉換成xml:

 XmlParser = {};

    function XmlParser:ToXmlString(value)
        value = string.gsub(value, "&", "&"); -- '&' -> "&"
        value = string.gsub(value, "<", "&lt;"); -- '<' -> "&lt;"
        value = string.gsub(value, ">", "&gt;"); -- '>' -> "&gt;"
        value = string.gsub(value, "\"", "&quot;"); -- '"' -> "&quot;"
        --value = string.gsub(value, "([^%w%&%;%p%\t% ])",
        --    function(c)
        --        return string.format("&#x%X;", string.byte(c))
        --    end);
        return value;
    end
--this is luatoxml
local M = {}
local indentation = ""
local xxxx = newParser()
function M.toxml(value)
    local xml = ""
    local t = type(value)

    if t == "string" then
        xml = xml .. indentation .. "<" .. value .. "/>\n"
    elseif t == "table" then
        for name, data in pairs(value) do
            if type(name) == "number" and type(data) == "table" then
                xml = xml .. "<entry>"
                xml = xml .. M.toxml(data)
                xml = xml .. "</entry>"
            elseif type(data) == "table" then
                local arr = true
                for kk, vv in pairs(data) do
                    if type(kk) ~= "number" then
                        arr = false
                        break
                    end
                end
                local sssss = ""
                if arr then
                    for g = 1, #data do
                        if type(data[g]) == "table" then
                            for gg = 1, #data[g] do
                                sssss = sssss .. data[g][gg] .. ","
                            end
                        else
                            sssss = sssss .. data[g] .. ","
                        end
                    end
                else
                    for kk, vv in pairs(data) do
                        sssss = sssss .. vv .. ","
                    end
                end
                xml = xml .. indentation .. "<" .. name .. ">"
                xml = xml .. sssss
                xml = xml .. indentation .. "</" .. name .. ">\n"
            else
                xml = xml .. indentation .. "<" .. name
                if type(data) == "table" then
                    local children = {}
                    local number_strings = {}
                    for k, v in pairs(data) do
                        local vtype = type(v)
                        local ktype = type(k)
                        if vtype == "table" then
                            children[k] = v
                        elseif ktype == "string" then
                            xml = xml .. " " .. k .. '="' .. tostring(v) .. '"'
                        elseif ktype == "number" and vtype == "string" then
                            table.insert(number_strings, v)
                        end
                    end

                    if next(children) ~= nil or #number_strings > 1 then
                        xml = xml .. ">\n"
                        indentation = indentation .. "\t"
                        xml = xml .. M.toxml(children)
                        xml = xml .. M.toxml(number_strings)
                        indentation = indentation:sub(1, #indentation - 1)
                        xml = xml .. indentation .. "</" .. name .. ">\n"
                    else
                        if #number_strings == 1 then
                            xml = xml .. ">" .. number_strings[1] .. "</" .. name .. ">\n"
                        else
                            xml = xml .. "/>\n"
                        end
                    end
                elseif string.find(tostring(data), "<") ~= nil then
                    xml = xml .. ">" .. xxxx:ToXmlString(data) .. "</" .. name .. ">\n"
                else
                    xml = xml .. ">" .. tostring(data) .. "</" .. name .. ">\n"
                end
            end
        end
    end
    return xml
end

return M
local luatoxml = require "luatoxml"
    local tableName = "表名"
    local temp = require(tableName)
    f = assert(io.open("luaToxml/" .. tableName .. '.xml', 'w'))--轉換後的xml名字,存放路徑
    f:write('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>')
    f:write('<LocalDatas xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">')
    f:write(luatoxml.toxml(temp))
    f:write("</LocalDatas>")
    f:close()