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.."?(.*)$";
14 --luacheck: ignore 212/self
16 local stanza = st.stanza("root");
17 function handler:StartElement(tagname, attr)
18 local curr_ns,name = tagname:match(ns_pattern);
20 curr_ns, name = "", curr_ns;
28 local ns, nm = k:match(ns_pattern);
32 attr[ns..":"..nm] = attr[k];
37 stanza:tag(name, attr);
39 function handler:CharacterData(data)
42 function handler:EndElement()
45 local parser = lxp.new(handler, "\1");
46 local ok, err, line, col = parser:parse(xml);
47 if ok then ok, err, line, col = parser:parse(); end
50 return stanza.tags[1];
52 return ok, err.." (line "..line..", col "..col..")";