我正在尝试解析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
层次太多而且看起来很慢..有什么建议可以提高效率吗?
答案 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