Software /
code /
prosody
Comparison
util/xml.lua @ 6978:30c96a5db360
util.stanza, util.xml, util.xmppstream: Add support for tracking defined namespaces and their prefix (stanza.namespaces), knowing/preserving prefix names is required for some applications (thanks daurnimator)
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 08 Dec 2015 23:15:42 +0000 |
parent | 6777:5de6b93d0190 |
child | 7239:c9af793b2d8f |
comparison
equal
deleted
inserted
replaced
6977:450db0b83fe9 | 6978:30c96a5db360 |
---|---|
12 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; | 12 local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; |
13 return function(xml) | 13 return function(xml) |
14 --luacheck: ignore 212/self | 14 --luacheck: ignore 212/self |
15 local handler = {}; | 15 local handler = {}; |
16 local stanza = st.stanza("root"); | 16 local stanza = st.stanza("root"); |
17 local namespaces = {} | |
18 function handler:StartNamespaceDecl(prefix, url) | |
19 if prefix ~= nil then | |
20 namespaces[prefix] = url | |
21 end | |
22 end | |
23 function handler:EndNamespaceDecl(prefix) | |
24 if prefix ~= nil then | |
25 namespaces[prefix] = nil | |
26 end | |
27 end | |
17 function handler:StartElement(tagname, attr) | 28 function handler:StartElement(tagname, attr) |
18 local curr_ns,name = tagname:match(ns_pattern); | 29 local curr_ns,name = tagname:match(ns_pattern); |
19 if name == "" then | 30 if name == "" then |
20 curr_ns, name = "", curr_ns; | 31 curr_ns, name = "", curr_ns; |
21 end | 32 end |
32 attr[ns..":"..nm] = attr[k]; | 43 attr[ns..":"..nm] = attr[k]; |
33 attr[k] = nil; | 44 attr[k] = nil; |
34 end | 45 end |
35 end | 46 end |
36 end | 47 end |
37 stanza:tag(name, attr); | 48 local n = {} |
49 for prefix, url in pairs(namespaces) do | |
50 n[prefix] = url | |
51 end | |
52 stanza:tag(name, attr, n); | |
38 end | 53 end |
39 function handler:CharacterData(data) | 54 function handler:CharacterData(data) |
40 stanza:text(data); | 55 stanza:text(data); |
41 end | 56 end |
42 function handler:EndElement() | 57 function handler:EndElement() |