Ir para conteúdo

[Arquivado]Easy Xml Lib


Mock

Posts Recomendados

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 otscript live se nao rodar no seu server e por causa da função string.explode.

 

Em fim sim eu sou mock daquele forum concorrente ._. decidi postar essa lib aqui tambem pois aqui tem muitos usuarios que ela poderia ser util.

 

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

 

Apesar disso ainda fiz uma função adcional para aprenderem melhor ocmo se usa a lib:

 

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)

Ele vai mostar no console:

Mock

Skyen

 

Resumindo ele retorna uma tabela +/- assim

Table = {
[1] = {name="mock", id=123},
[2] = {level=12}
}

caso eu tenha postado na seção errada perdão poderima mover para a correta? :p

Caso seje a seção correta ignore oq eu disse acima.

Editado por Mock
Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
  • 3 weeks later...
  • 8 years later...
Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...