使用LuaXML解析具有相同名称的多个标签的XML。
2013-10-3 10:37:33
收藏:0
阅读:173
评论:2
我正在尝试从 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
有太多的层,似乎太慢了... 有什么建议可以提高效率吗?
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
调用
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