lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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