2 local st = require "util.stanza";
3 local lxp = require "lxp";
7 local parse_xml = (function()
9 ["http://www.w3.org/XML/1998/namespace"] = "xml";
11 local ns_separator = "\1";
12 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$";
15 local stanza = st.stanza("root");
16 function handler:StartElement(tagname, attr)
17 local curr_ns,name = tagname:match(ns_pattern);
19 curr_ns, name = "", curr_ns;
27 local ns, nm = k:match(ns_pattern);
31 attr[ns..":"..nm] = attr[k];
36 stanza:tag(name, attr);
38 function handler:CharacterData(data)
41 function handler:EndElement(tagname)
44 local parser = lxp.new(handler, "\1");
45 local ok, err, line, col = parser:parse(xml);
46 if ok then ok, err, line, col = parser:parse(); end
49 return stanza.tags[1];
51 return ok, err.." (line "..line..", col "..col..")";