[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Parsing XML
- From: Eva Schmidt <es@...>
- Date: Mon, 09 Jul 2007 16:06:24 +0200
Hello everybody,
I'm currently using the simple XML-Parser from R. Ierusalimschy published on
http://lua-users.org/wiki/LuaXml. It works fine, but it puts every tag and
attribute in an XML-file onto a stack. So the structure gets a little bit large.
I would need a mor flat structure.
I tried to parse the stack and create a more flat Lua table instead. That worked
also, but the approach was very special to my problem (it parses the stack
recursively and collects label-value pairs and creates for any recursion a new
nested table).
The problem with this are the duplicate labels, that should create different
table instead of overwriting the old ones...
Does anybody have simliar problems and maybe some good ideas or approaches how
to convert the deep Lua stack to a flat table, including the dealing with
duplicate labels?
Here's some example code from me, but I'm not really happy with that:
--
-- parse stack and put instrument data in tables
--
-- counters
local c = 0
local x = 1
function parse_stack (tbl, result_tbl, tags)
for j = 1, table.getn(tbl) do
local value, label
for i,v in pairs (tbl[j]) do
if i == "label" then
label = v
elseif i == "xarg" then
if (tbl[j][i].Value) then
value = tbl[j][i].Value
end
end
if value == nil and label then
-- create a separate table for a complete instrument description
if label == "Instrument" then
c = 0
label = x
result_tbl[label] = {}
parse_stack (tbl[j], result_tbl[label],tags)
x = x + 1
else
parse_stack (tbl[j], result_tbl, tags)
end
elseif value and label then
build_instrument (label, value, result_tbl, c, tags)
end
end
end
-- in case of duplicate tags append a number to differentiate
c = c + 1
end
--
-- utility for building an instrument
--
function build_instrument (label, value, tbl, count, tags)
-- extend name of duplicate labels
if (tbl[label]) then
label = label .. "_" .. count
end
table.insert (tags, label)
tbl[label] = value
end
Thanks for any idea!
All the best!
Eva