Ir para conteúdo
Entre para seguir isso  
Mock

Easy XML lib

Recommended Posts

Mock    32
Mock

Olá, estou aqui postando 5 funções para mexer com XML (pegar dados apenas) vi que algumas pessoas tem dificuldade para pegar dados de um XML entao decidi fazer essa lib, apesar de ser bem inutil para pessoas experientes ela serve para iniciantes, ficou bem simples, defidi mesmo fazela para ter mais um motivo para usar POO em uma lib

:P

 

Essa lib roda em qualquer otserver pois rodou no debugger do SCITE e do otscriptive se nao rodar no seu server e por causa da função string.explode.

 

 

Vamos adciona-la logo, vá até funcions.lua e adcione essa linha:

dofile('Easy-xml-lib.lua')

Depois fassa o download da lib aqui: http://lua.pastey.net/119938

ou se preferir crie o arquivo easy-xml-lib.lua e ponha o seguinte conteudo:

--[[
* Author: Mock
* Version: 1.00.0
* How to use:
> local kind = 2 -- you can change to see another mode
> local XML = [==[
<?xml version="1.0" encoding="UTF-8"?>
<flags>
   <flag summonable="0"/>
   <flag attackable="0"/>
   <flag hostile="1"/>
   <flag illusionable="0"/>
   <flag convinceable="0"/>
   <flag pushable="1"/>
   <flag canpushitems="1"/>
   <flag canpushcreatures="0"/>
   <flag targetdistance="1"/>
   <flag staticattack="90"/>
   <flag runonhealth="0"/>
 </flags>
]==]
> local read = xml:open(XML) -- or xml:open('<xml string="..../>')
> read:setSess('flags','flag','mysession') -- <flags>, <flag summonable="0"/>, name of this session?
> print(type(read:getSess('mysession'))) --- Will print on console an swtring with XML code fo session flag: <flags><flag summonab...
> if kind == 1 then
>> table_ = read:readSess('mysession')
> else
>> table_ = read:readFree('flag')
> end
> print('-----')
> for k,v in pairs(table_) do
>> for m,n in pairs(v) do
>>> print(m,n)
>> end
> end
>>> print:
table
-----
summonable, 0
attackable, 0
hostile, 1
illusionable, 0
convinceable, 0
pushable, 1
canpushitems, 1
canpushcreatures, 0
targetdistance, 1
staticattack, 90
runonhealth, 0


* Special thanks for:
** Skyen hasus
** Magus
]]--

xml = {} -- classe
function xml:open(file,kind)
        if kind ~= nil then
           local file2 = assert(io.open(file,'r'))
           file = file2:read(-1)
           file2:close()
        end
        if file == nil then
           return error('File is empyt')
        end
        alt = string.explode(file,'\n',2)
        if alt[1] == nil or string.find(alt[1],"<?xml") == nil then
           return error('Bad xml format')
        end
        file = {text=alt[2],encoding=alt,session={}}
        setmetatable(file, {__index = xml})
        return file
end

function xml:setSess(sessname,tagname,setSess)
        xmlstr = self.text
        local f = ""
        for ret in xmlstr:gmatch('<'..sessname..'>(.-)</'..sessname..'>') do
            f = ret
        end
        if f:len() == 0 then
        return error('Cannot find session called '..sessname..'.')
        end
        self.session[setSess] = {f,tagname=tagname,sessname=sessname}
        return TRUE
end

function xml:getSess(SessName)
  return self.session[sessName]
end

function xml:readSess(SessName)
local ret = self.session[sessName]
local t,x = {},1
for xmla in ret[1]:gmatch('<'..ret.tagname..' (.-)/>') do
       t[x] = {}
       for i, v in xmla:gmatch('([^ ]-)="(.-)"') do
           t[x][i] = v
       end
       x = x + 1
   end
   return t
end
function xml:readFree(tagname)
local ret = self.text
local t,x = {},1
for xmla in ret:gmatch('<'..tagname..' (.-)/>') do
       t[x] = {}
       for i, v in xmla:gmatch('([^ ]-)="(.-)"') do
           t[x][i] = v
       end
       x = x + 1
   end
   return t
end

 

No proprio script tem ensinando a usar:

local kind = 2 -- you can change to see another mode
local XML = [==[
<?xml version="1.0" encoding="UTF-8"?>
<flags>
   <flag summonable="0"/>
   <flag attackable="0"/>
   <flag hostile="1"/>
   <flag illusionable="0"/>
   <flag convinceable="0"/>
   <flag pushable="1"/>
   <flag canpushitems="1"/>
   <flag canpushcreatures="0"/>
   <flag targetdistance="1"/>
   <flag staticattack="90"/>
   <flag runonhealth="0"/>
 </flags>
]==]
local read = xml:open(XML) -- or xml:open('<xml string="..../>')
read:setSess('flags','flag','mysession') -- <flags>, <flag summonable="0"/>, name of this session?
print(type(read:getSess('mysession'))) --- Will print on console an swtring with XML code fo session flag: <flags><flag summonab...
if kind == 1 then
 table_ = read:readSess('mysession')
else
 table_ = read:readFree('flag')
end
print('-----')
 for k,v in pairs(table_) do
   for m,n in pairs(v) do
     print(m,n)
   end
 end

 

Divirtam-se

 

 

ps: outro codezinho pra reforçar +

local XML = [==[
<?xml version="1.0" encoding="UTF-8"?>
<vars>
   <var name="Mock" id="123"/>
   <var level="27"/>
 </vars>
<vars2>
   <var2 name="Skyen" id="321"/>
   <var2 level="12"/>
 </vars2>
 ]==]
local v_a = xml:open(XML)
v_a:setSess('vars','var','mocksess')
v_a:setSess('vars2','var2','skyensess')
ret = v_a:readSess('mocksess')
print(ret[1].name)
ret2 = v_a:readSess('skyensess')
print(ret2[1].name)

Vai mostrar no console do seu server (usando CONSOLE nao GUI):

Mock

Skyen

Vai retorna uma tabela assim

Table = {

[1] = {name="mock", id=123},

[2] = {level=12}

}

agradeço ao magus por essa parte ^^

Editado por Mock

Compartilhar este post


Link para o post
KwiiBy~    0
KwiiBy~

Poxa mock, não entendi o que esta sua lib faz?

Compartilhar este post


Link para o post
Mock    32
Mock

@KwiiBy~

ela abre arquivos XML e retorna uma tabela com o conteudo separado

Compartilhar este post


Link para o post
Lyu Elite    0
Lyu Elite

Mock.

Eu to com a mesma duvida do KwiiBy~

E não entendi sua explicação,do post #3

Compartilhar este post


Link para o post
Mock    32
Mock

Cara, você tem um arquivo em XML e quer usar sei la o looktype do monster, oq vc faz?

Xorava...

Agora n

"<look type="48" head="20" body="30" legs="40" feet="50" corpse="5993"/>"

 

local v_a = xml:open('data/monsters/demon.xml','file')

ret2 = v_a:readFree('look')

print(ret2[1].type,ret2[1].head,ret2[1].body,ret2[1].legs,ret2[1].feet)

Compartilhar este post


Link para o post
Lwkass    1
Lwkass

o ruim é que o arquivo xml tem que estar no script não é ? Se tivesse como substituir partes de outros arquivos xml... me ajudaria muito...

Compartilhar este post


Link para o post
Mock    32
Mock

@lwkass

se vc prestar atenção entenderia, o xml nao presisa estar no lua.

você pode simplesmente usar:

local v_a = xml:open('data/monsters/demon.xml','file')

Compartilhar este post


Link para o post
Lwkass    1
Lwkass

É mais mesmo assim eu já consegui de uma maneira mais fácil oque eu queria. Vlw mesmo assim.

Compartilhar este post


Link para o post
Lyu Elite    0
Lyu Elite

obrigado mock por me explica esta funcao

Compartilhar este post


Link para o post
Conde2    0
Conde2

Caraca quem diria em =O

Essa nem eu esperava =D

ta muito boa essa mini LIB realmente vocês estão de parabéns !!

vou analisar ela direitinho

Compartilhar este post


Link para o post
sanguebom    0
sanguebom

é

vai facilitar muito os scripts

vlw

Compartilhar este post


Link para o post
Mock    32
Mock

Corrigi um pequeno bug. ^^

Compartilhar este post


Link para o post
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  
  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×