使用LuaXML解析具有相同名称的多个标签的XML。

我正在尝试从 XML 文件中解析数据,例如:

<level>
  <bg>details1</bg>
  <bg>details2</bg>
</level>

使用 xml.find(bg),我只能得到 details1。这是因为 xml.find 返回符合条件的第一个(子)表或 nil。

如果我想要读取两个 bg,则如何在 LuaXML 中完成?或者请介绍另一个适用于 Lua 的 XML 库。

插件 我的实际场景如下:

<a>
   <b>
    <level>
      <bg>details1</bg>
    </level>
    <level>
      <bg>details2</bg>
    </level>
   </b>
</a>

我知道我需要将整个 b 对象读出并使用 xml.tag 读取 level。但是我的尝试失败了。你能帮我调试这段代码吗?


最终,我根据 Mike Corcoran 的建议找到了解决方案。

require 'luaxml'

local text = [[
<a>
   <bcde>
    <level>
      <bg>details1</bg>
    </level>
    <level>
      <bg>details2</bg>
    </level>
   </bcde>
</a>
]]

local txml = xml.eval(text)
for _, node in pairs(txml:find("bcde")) do
 if node.TAG ~= nil then
        if node[node.TAG] == "level" then
            local bg = node:find("bg")
                if bg ~= nil then
                for i=1, #bg do
                    print( bg[i])
                end
            end
        end
    end
end

有太多的层,似乎太慢了... 有什么建议可以提高效率吗?

点赞
用户234175
用户234175

调用 xml.load 后,您将获得一个代表刚加载的 XML 文件的表格。您可以通过访问该表格中对应的数字索引来访问特定节点:

require 'luaxml'

local level = xml.load('level.xml')

-- level[1] == <bg>details1</bg>
-- level[2] == <bg>details2</bg>
for i = 1, #level do
  print(level[i])
end

编辑:从您编辑后的问题中,以下是从 XML 文件中提取数据的一种方法:

require 'luaxml'

local xmlroot = xml.load('your.xml')
local b = xmlroot:find 'b'

for level = 1, #b do
  print(b[level][1][1])
end

如果您控制 XML 格式,可以将其修改为更易于解析:

<a>
   <b>
    <level bg="details1"> </level>
    <level bg="details2"> </level>
   </b>
</a>

通过这种更改,bg 成为 level 节点的 属性。这减少了一级间接性。要访问 bg 属性,只需使用 lua 中的 . 运算符,bg 作为键即可。然后,可以修改解析循环以获得:

for level = 1, #b do
  print(b[level].bg)
end
2013-07-17 19:07:00
用户1208078
用户1208078

只需遍历级别标签的所有子节点(除非您没有告诉我们需要过滤的其他信息)

require 'luaxml'

local text = [[
<level>
    <bg>details1</bg>
    <bg>details2</bg>
</level>
]]

local VALUE = 1

local txml = xml.eval(text)
for _, node in pairs(txml:find("level")) do
    if node.TAG ~= nil then
        print(node[VALUE])
    end
end

如果您需要过滤掉除 <bg> 标签之外的所有内容,只需轻微修改循环:

for _, node in pairs(txml:find("level")) do
    if node.TAG ~= nil then
        if node[node.TAG] == "bg" then
            print(node[VALUE])
        end
    end
end
2013-07-17 20:03:12