Poccnn 385 Postado Julho 16, 2016 Share Postado Julho 16, 2016 (editado) Vim aqui explicar sobre a livraria luaxml, suas funções e implementações. Primeiro: Adicionar em seu servidor a livraria luaXml.lua e LuaXML_lib.dll esse é o script da luaXml.lua que voce vai ter que por esse arquivo com esse codigo na mesma pasta do seu executavel. Spoiler require("LuaXML_lib") local base = _G local xml = xml module("xml") -- symbolic name for tag index, this allows accessing the tag by var[xml.TAG] TAG = 0 -- sets or returns tag of a LuaXML object function tag(var,tag) if base.type(var)~="table" then return end if base.type(tag)=="nil" then return var[TAG] end var[TAG] = tag end -- creates a new LuaXML object either by setting the metatable of an existing Lua table or by setting its tag function new(arg) if base.type(arg)=="table" then base.setmetatable(arg,{__index=xml, __tostring=xml.str}) return arg end local var={} base.setmetatable(var,{__index=xml, __tostring=xml.str}) if base.type(arg)=="string" then var[TAG]=arg end return var end -- appends a new subordinate LuaXML object to an existing one, optionally sets tag function append(var,tag) if base.type(var)~="table" then return end local newVar = new(tag) var[#var+1] = newVar return newVar end -- converts any Lua var into an XML string function str(var,indent,tagValue) if base.type(var)=="nil" then return end local indent = indent or 0 local indentStr="" for i = 1,indent do indentStr=indentStr.." " end local tableStr="" if base.type(var)=="table" then local tag = var[0] or tagValue or base.type(var) local s = indentStr.."<"..tag for k,v in base.pairs(var) do -- attributes if base.type(k)=="string" then if base.type(v)=="table" and k~="_M" then -- otherwise recursiveness imminent tableStr = tableStr..str(v,indent+1,k) else s = s.." "..k.."=\""..encode(base.tostring(v)).."\"" end end end if #var==0 and #tableStr==0 then s = s.." />\n" elseif #var==1 and base.type(var[1])~="table" and #tableStr==0 then -- single element s = s..">"..encode(base.tostring(var[1])).."</"..tag..">\n" else s = s..">\n" for k,v in base.ipairs(var) do -- elements if base.type(v)=="string" then s = s..indentStr.." "..encode(v).." \n" else s = s..str(v,indent+1) end end s=s..tableStr..indentStr.."</"..tag..">\n" end return s else local tag = base.type(var) return indentStr.."<"..tag.."> "..encode(base.tostring(var)).." </"..tag..">\n" end end -- saves a Lua var as xml file function save(var,filename) if not var then return end if not filename or #filename==0 then return end local file = base.io.open(filename,"w") file:write("<?xml version=\"1.0\"?>\n<!-- file \"",filename, "\", generated by LuaXML -->\n\n") file:write(str(var)) base.io.close(file) end -- recursively parses a Lua table for a substatement fitting to the provided tag and attribute function find(var, tag, attributeKey,attributeValue) -- check input: if base.type(var)~="table" then return end if base.type(tag)=="string" and #tag==0 then tag=nil end if base.type(attributeKey)~="string" or #attributeKey==0 then attributeKey=nil end if base.type(attributeValue)=="string" and #attributeValue==0 then attributeValue=nil end -- compare this table: if tag~=nil then if var[0]==tag and ( attributeValue == nil or var[attributeKey]==attributeValue ) then base.setmetatable(var,{__index=xml, __tostring=xml.str}) return var end else if attributeValue == nil or var[attributeKey]==attributeValue then base.setmetatable(var,{__index=xml, __tostring=xml.str}) return var end end -- recursively parse subtags: for k,v in base.ipairs(var) do if base.type(v)=="table" then local ret = find(v, tag, attributeKey,attributeValue) if ret ~= nil then return ret end end end end Não vou postar a dll para não virem dizer que tem virus. voce que tem o sistema lua implementado em seu pc, pode pegar a dll de dentro do diretorio: Citar "...\Lua\5.1\clibs\LuaXML_lib.dll" copie essa dll e coloque ela na mesma pasta do executavel. implementado essa nova livraria em seu servidor. agora irei explicar um pouco sobre as funções e implementações dessa livraria. conhecendo as funções dessa livraria disponibilizada por lua: Citar function xml.load(dir) > carrega o arquivo xml >> xfile_read = xml.load("test.xml") function xml.find(var, tag, attributeKey,attributeValue) > ler um bloco do arquivo >> xfile_block = xfile_read:find("scene") function xml.tag(var,tag) -- ele pode pegar ou inserir uma tag (palavra do cabeçalho de um bloco) > pega o nome da tag da parte lida >> xfile_block:tag() >>> basicamente a palavra chave que foi lida. > insere o nome de uma tag >> xfile_new:tag('vocation') >>> <vocation> <nome = "nome"/> <id = "0"/></vocation> function xml.eval(xmlstring) > converte uma string xml para uma tabela lua codificada. function xml.str(var, indent, tag) >converte as variaveis (cadeia de dados em uma tabela) para uma string formatada em xml. function new(arg) > cria um novo codigo em xml >> create_new_xml_layout = xml.new("esseEoNomeDaTagDeComando") function append(var,tag) > insere um bloco no codigo > > Os valores podem ser inseridos entre tags com o uso do index [1] (um) ou dentro da propria tag com uso do index [0] (zero) >> create_new_xml_layout:append("nomeDaTag")[1] = 123 - saida>>> <nomeDaTag>123</nomeDaTag> >> create_new_xml_layout:append("nomeDaTag")[0] = 123 - saida>>> <nomeDaTag 123/> function str(var,indent,tagValue) > converte em string um bloco de comando >> xfile_read:str() >>> mesma coisa retornada por find() function save(var,filename) > salva os dados em um arquivo xml existem outras funções, mas não irei tratar delas. vamos a um uso pratico dessas funções da livraria usando como base o arquivo vocations.xml. apenas para uso didatico, deixo aqui uma parte do codigo do arquivo vocations.xml que irei usar no codigo de exemplo. Spoiler <vocation id="0" name="None" description="none" needpremium="0" gaincap="5" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" soulmax="100" gainsoulticks="86800" fromvoc="0" attackable="yes"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> </vocation> <vocation id="1" name="Sorcerer" description="a Sorcerer" needpremium="0" gaincap="10" gainhp="5" gainmana="30" gainhpticks="1" gainhpamount="0.8" gainmanaticks="1" gainmanaamount="6.7" manamultiplier="1.1" attackspeed="2000" soulmax="100" gainsoulticks="600" fromvoc="1"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.1" magHealingDamage="1.0" defense="1.0" magDefense="1.2" armor="1.0"/> <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> </vocation> ... vamos agora ao codigo que irei usar como uso implementavel das funções da livraria luaxml. Citar require('LuaXml') local str = [[ <vocation id="0" name="None" description="none" needpremium="0" gaincap="5" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" soulmax="100" gainsoulticks="86800" fromvoc="0" attackable="yes"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> </vocation> ]] local tab = xml.eval(str) for k,v in pairs(tab) do if(type(v) == 'string')then print('eval: ['..k..'] = '..v) end end local xfile_load = xml.load("vocations.xml") local xfile_find = xfile_load:find("vocation",'name','Sorcerer') if not xfile_find then return end local new_xfile = xml.new('sorcerer') local formula = xfile_find[1]:find('formula') local skills = xfile_find[2]:find('skill') new_xfile:tag('Bruxo') new_xfile:append('id')[1] = xfile_find.id new_xfile:append('id')[0] = 'autor nome = "Marcryzius" data = "16/julho/2016"' new_xfile:append('gaincap')[0] = 'gainCapDefAndAxe cap = "'..xfile_find.gaincap..'" def = "'..formula.defense..'" axe = "'..skills.axe..'"' xfile_find['id'] = 'newid' xfile_find['newid'] = '0' xfile_find.newid = '2' new_xfile:append('newid')[1] = xfile_find.newid new_xfile:append('id')[1] = xfile_find.id or 'nil' new_xfile:save('dadosXml.xml') Explicando o codigo postado acima. Citar -- Carrega a livraria LuaXml require('LuaXml') -- Peguei uma parte do codigo do arquivo vocations.xml e coloquei-o como string para estudarmos o funcionamento da função eval. local str = [[ <vocation id="0" name="None" description="none" needpremium="0" gaincap="5" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" soulmax="100" gainsoulticks="86800" fromvoc="0" attackable="yes"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> <skill fist="1.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/> </vocation> ]] -- Apenas imprimi os valores strings associados aos index. outros valores como table, não foram acessados. local tab = xml.eval(str) for k,v in pairs(tab) do if(type(v) == 'string')then print('eval: ['..k..'] = '..v) end end --Saida gerada por esse programa Citar eval: [0] = vocation eval: [description] = none eval: [gaincap] = 5 eval: [needpremium] = 0 eval: [gainhpticks] = 6 eval: [attackable] = yes eval: [gainmanaamount] = 1 eval: [gainmanaticks] = 6 eval: [soulmax] = 100 eval: [id] = 0 eval: [attackspeed] = 2000 eval: [gainsoulticks] = 86800 eval: [name] = None eval: [fromvoc] = 0 eval: [manamultiplier] = 4.0 eval: [gainhpamount] = 1 eval: [gainmana] = 5 eval: [gainhp] = 5 -- Carrega o arquivo xml local xfile_load = xml.load("vocations.xml") -- Pega o bloco requerido segundo os parametros fornecidos. -- pode ser qualquer parâmetro que esteja inserido na tag ('vocation' << cabeçalho da tag - 'id','4' << retornar a tag do knight, 'name','Druid' ...). -- sempre use parâmetros em string mesmo que seja numeros, tem que ser fornecidos em string. local xfile_find = xfile_load:find("vocation",'name','Sorcerer') -- Verificação se houve resultado retornado. if not xfile_find then return end -- Criação de novos dados em xml -- 'Sorcerer' seria a tag do cabeçalho do bloco criado >> <sorcerer> ... </sorcerer> local new_xfile = xml.new('sorcerer') -- Esse daqui são dois exemplos de tags que existem dentro da tag principal. -- Cada tag é chamada por um index sucessivo e ascendente. local formula = xfile_find[1]:find('formula') local skills = xfile_find[2]:find('skill') -- Modifica o nome da tag do cabeçalho; nesse caso: 'Sorcerer'(declarado em xml.new) torna-se 'Bruxo'. new_xfile:tag('Bruxo') -- index [1], Adiciona valores entre tags >> saida gerado por essa função >> <id>1</id> new_xfile:append('id')[1] = xfile_find.id -- index [0], adiciona valores na tag >> saida gerada por essa função >> <autor nome = "Marcryzius" data = "16/julho/2016" /> new_xfile:append('id')[0] = 'autor nome = "Marcryzius" data = "16/julho/2016"' -- Mais um exemplo de adição de valores na tag >> saida gerada por essa função >> <gainCapDefAndAxe cap = "10" def = "1.0" axe = "2.0" /> new_xfile:append('gaincap')[0] = 'gainCapDefAndAxe cap = "'..xfile_find.gaincap..'" def = "'..formula.defense..'" axe = "'..skills.axe..'"' -- Adiciona novas variaveis dentro da propria cadeia de caracteres retornanda pela função find xfile_find['newid'] = '0' -- Modifica valores associados as variaveis xfile_find['id'] = 'newid' xfile_find.newid = '2' -- Cria uma nova tag com valores entre as tags >> <newid>2</newid> new_xfile:append('newid')[1] = xfile_find.newid -- Idem >> <id>newid</id> new_xfile:append('id')[1] = xfile_find.id or 'nil' -- Salva essa string de caracteres em um arquivo formatado como xml. new_xfile:save('dadosXml.xml') -- insira o caminho onde vai ser salvo o arquivo. Esse é o codigo dentro do arquivo (dadosXml.xml) gerado por esse programa: Citar <?xml version="1.0"?> <!-- file "dados.xml", generated by LuaXML --> <Bruxo> <id>1</id> <autor nome = "Marcryzius" data = "16/julho/2016" /> <gainCapDefAndAxe cap = "10" def = "1.0" axe = "2.0" /> <newid>2</newid> <id>newid</id> </Bruxo> Espero que tenham entendido. Qualquer duvida, deixe nos comentarios e tentarei ajuda-lo. Editado Julho 16, 2016 por Poccnn Link para o comentário Compartilhar em outros sites More sharing options...
kttallan 318 Postado Julho 16, 2016 Share Postado Julho 16, 2016 Parabéns otimo tutorial, sempre quiz saber como usar xml's . Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados