util/xml.lua
changeset 7242 c9af793b2d8f
parent 6981 30c96a5db360
child 8558 4f0f5b49bb03
--- a/util/xml.lua	Sat Mar 05 20:50:17 2016 +0000
+++ b/util/xml.lua	Sat Mar 05 17:51:35 2016 -0500
@@ -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 @@
 		--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 @@
 				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