util.xml: Correct stanza.namespaces table construction when duplicate prefix names...
authorWaqas Hussain <waqas20@gmail.com>
Sat, 5 Mar 2016 22:51:35 +0000 (17:51 -0500)
committerWaqas Hussain <waqas20@gmail.com>
Sat, 5 Mar 2016 22:51:35 +0000 (17:51 -0500)
util/xml.lua

index 9e12f0dff1b6856cf94a798d2291ead3c223fea9..ec06fb0159e22ec6308d79a481fda51669ea5e2d 100644 (file)
@@ -1,6 +1,8 @@
 
 local st = require "util.stanza";
 local lxp = require "lxp";
+local t_insert = table.insert;
+local t_remove = table.remove;
 
 local _ENV = nil;
 
@@ -14,15 +16,19 @@ local parse_xml = (function()
                --luacheck: ignore 212/self
                local handler = {};
                local stanza = st.stanza("root");
-               local namespaces = {}
+               local namespaces = {};
+               local prefixes = {};
                function handler:StartNamespaceDecl(prefix, url)
                        if prefix ~= nil then
-                               namespaces[prefix] = url
+                               t_insert(namespaces, url);
+                               t_insert(prefixes, prefix);
                        end
                end
                function handler:EndNamespaceDecl(prefix)
                        if prefix ~= nil then
-                               namespaces[prefix] = nil
+                               -- we depend on each StartNamespaceDecl having a paired EndNamespaceDecl
+                               t_remove(namespaces);
+                               t_remove(prefixes);
                        end
                end
                function handler:StartElement(tagname, attr)
@@ -46,8 +52,8 @@ local parse_xml = (function()
                                end
                        end
                        local n = {}
-                       for prefix, url in pairs(namespaces) do
-                               n[prefix] = url
+                       for i=1,#namespaces do
+                               n[prefixes[i]] = namespaces[i];
                        end
                        stanza:tag(name, attr, n);
                end