MO

[Arquivado]Easy Xml Lib

Por Mock, 03 de ago. de 2009 em Noticias - Arquivo

otserv
script
8
1.5k
MockM
03 de agosto de 2009 às 21:12

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 Agosto 3 por Mock

2 semanas depois...
11 de agosto de 2009 às 11:18

não consegui achar muitas utilidades, dá pra usar algum código em lua?

MockM
14 de agosto de 2009 às 22:40

.... ._.

isso é pra usar em lua, nos otservers...

2 semanas depois...
satan666S
25 de agosto de 2009 às 13:53

qual seria a grande utilidade de usar essa lib?

MockM
29 de agosto de 2009 às 20:04

simples, pegar informações do XML rapido, facil e pratico usando isso.

Vo faze um script usando isso c vai ve ^^

Henrique MouraH
29 de agosto de 2009 às 20:07

Eu achei inútil, só da o trabalho de criar isso.

 

Abraços,

Henrique.

Editado Agosto 29 por KaKilo

1 mês depois...
MockM
19 de setembro de 2009 às 00:04

inutil nao.

vocÊ vai usar umas 30 linhas pra pegar so o HP max de um monstro no XML ou algo do loot

nisso vc usa 3~4 linhas e pronto.

8 anos depois...
StigalS
25 de abril de 2018 às 16:24
Esta noticia foi arquivada.
Este tópico está fechado e foi movido para Noticia - Arquivo.

+ Caso tenha atualizações você poderá criar outro tópico.