diff options
author | Waqas Hussain <waqas20@gmail.com> | 2012-12-03 06:07:00 +0500 |
---|---|---|
committer | Waqas Hussain <waqas20@gmail.com> | 2012-12-03 06:07:00 +0500 |
commit | d753412283d3b5042ad8f47741adcf49ab29621c (patch) | |
tree | 32193989f72cd93a36bea4a74cfbfb547277fe8b /util/xml.lua | |
parent | 8674db94117611ef4790c1d2859fd144c12dd7d1 (diff) | |
parent | 52a43878396f739d35f49a6194241878c47f6b26 (diff) | |
download | prosody-d753412283d3b5042ad8f47741adcf49ab29621c.tar.gz prosody-d753412283d3b5042ad8f47741adcf49ab29621c.zip |
Merge 0.9->trunk.
Diffstat (limited to 'util/xml.lua')
-rw-r--r-- | util/xml.lua | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/util/xml.lua b/util/xml.lua new file mode 100644 index 00000000..db446bc3 --- /dev/null +++ b/util/xml.lua @@ -0,0 +1,57 @@ + +local st = require "util.stanza"; +local lxp = require "lxp"; + +module("template") + +local parse_xml = (function() + local ns_prefixes = { + ["http://www.w3.org/XML/1998/namespace"] = "xml"; + }; + local ns_separator = "\1"; + local ns_pattern = "^([^"..ns_separator.."]*)"..ns_separator.."?(.*)$"; + return function(xml) + local handler = {}; + local stanza = st.stanza("root"); + function handler:StartElement(tagname, attr) + local curr_ns,name = tagname:match(ns_pattern); + if name == "" then + curr_ns, name = "", curr_ns; + end + if curr_ns ~= "" then + attr.xmlns = curr_ns; + end + for i=1,#attr do + local k = attr[i]; + attr[i] = nil; + local ns, nm = k:match(ns_pattern); + if nm ~= "" then + ns = ns_prefixes[ns]; + if ns then + attr[ns..":"..nm] = attr[k]; + attr[k] = nil; + end + end + end + stanza:tag(name, attr); + end + function handler:CharacterData(data) + stanza:text(data); + end + function handler:EndElement(tagname) + stanza:up(); + end + local parser = lxp.new(handler, "\1"); + local ok, err, line, col = parser:parse(xml); + if ok then ok, err, line, col = parser:parse(); end + --parser:close(); + if ok then + return stanza.tags[1]; + else + return ok, err.." (line "..line..", col "..col..")"; + end + end; +end)(); + +parse = parse_xml; +return _M; |