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");
18 function handler:StartNamespaceDecl(prefix, url)
20 namespaces[prefix] = url
23 function handler:EndNamespaceDecl(prefix)
25 namespaces[prefix] = nil
28 function handler:StartElement(tagname, attr)
29 local curr_ns,name = tagname:match(ns_pattern);
31 curr_ns, name = "", curr_ns;
39 local ns, nm = k:match(ns_pattern);
43 attr[ns..":"..nm] = attr[k];
49 for prefix, url in pairs(namespaces) do
52 stanza:tag(name, attr, n);
54 function handler:CharacterData(data)
57 function handler:EndElement()
60 local parser = lxp.new(handler, "\1");
61 local ok, err, line, col = parser:parse(xml);
62 if ok then ok, err, line, col = parser:parse(); end
65 return stanza.tags[1];
67 return ok, err.." (line "..line..", col "..col..")";