Software /
code /
prosody
File
util/xml.lua @ 6391:4d334d00c635
plugins/muc/muc.lib: Add instant room support
author | daurnimator <quae@daurnimator.com> |
---|---|
date | Fri, 05 Sep 2014 11:19:16 -0400 |
parent | 5776:bd0ff8ae98a8 |
child | 6663:d3023dd07cb6 |
line wrap: on
line source
local st = require "util.stanza"; local lxp = require "lxp"; module("xml") 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;