生成文章|

lua 解析xml文本的超级函数

2016-11-18 15:54
1051
  1. local XmlParse = {};

  2. local function parseargs(s)
  3.         local arg = {}
  4.         string.gsub(s, "([%-%w]+)=([\"'])(.-)%2", function (w, _, a)
  5.                 arg[w] = a
  6.         end)
  7.         return arg
  8. end

  9. function XmlParse.parse2Table(s)
  10.         local stack = {}
  11.         local top = {}
  12.         table.insert(stack, top)
  13.         local ni,c,label,xarg, empty
  14.         local i, j = 1, 1
  15.         while true do
  16.                 ni,j,c,label,xarg, empty = string.find(s, "<(%/?)([%w:]+)(.-)(%/?)>", i)
  17.                 if not ni then break end
  18.                 local text = string.sub(s, i, ni-1)
  19.                 if not string.find(text, "^%s*$") then
  20.                         table.insert(top, text)
  21.                 end
  22.                 if empty == "/" then  -- empty element tag
  23.                         table.insert(top, {label=label, xarg=parseargs(xarg), empty=1})
  24.                 elseif c == "" then   -- start tag
  25.                         top = {label=label, xarg=parseargs(xarg)}
  26.                         table.insert(stack, top)   -- new level
  27.                 else  -- end tag
  28.                         local toclose = table.remove(stack)  -- remove top
  29.                         top = stack[#stack]
  30.                         if #stack < 1 then
  31.                                 error("nothing to close with "..label)
  32.                         end
  33.                         if toclose.label ~= label then
  34.                                 error("trying to close "..toclose.label.." with "..label)
  35.                         end
  36.                         table.insert(top, toclose)
  37.                 end
  38.                 i = j+1
  39.         end
  40.         local text = string.sub(s, i)
  41.         if not string.find(text, "^%s*$") then
  42.                 table.insert(stack[#stack], text)
  43.         end
  44.         if #stack > 1 then
  45.                 error("unclosed "..stack[#stack].label)
  46.         end
  47.         return stack[1]
  48. end
复制以上内容
收藏
1 条回帖
LV.22016-12-18 18:56
此帖仅作者可见
需要登陆后才可进行回复 登录

返回顶部
现在加入我们,注册一个账号 账号登陆 QQ账号登陆 微博账号登陆

微信扫一扫,马上找工作

在线客服