4

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

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

使用 xml.find(bg)我只能获取详细信息 1。这是因为 xml.find 返回与搜索条件匹配的第一个(子)表或 nil。

如果我想把两个 bg 都读出来。如何在 LuaXML 中实现它?或者请介绍其他 Lua XML 库作品。

插件我的真实场景是这样的

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

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


根据 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

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

4

2 回答 2

3

调用后,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.运算符 withbg作为键。然后可以将解析循环修改为:

for level = 1, #b do
  print(b[level].bg)
end
于 2013-07-17T19:07:00.197 回答
2

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

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-17T20:03:12.250 回答