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

时间:2013-07-17 18:45:10

标签: xml xml-parsing lua luaxml

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

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

使用xml.find(bg)我只能获得详细信息。这是因为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

层次太多而且看起来很慢..有什么建议可以提高效率吗?

2 个答案:

答案 0 :(得分: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 bg运算符作为键。然后可以将解析循环修改为:

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

答案 1 :(得分: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