2013-07-17 21 views
4

多个标签的XML我试图解析XML文件中的数据,如LuaXML解析与同名

<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读出水平。但是我的尝试失败了。你能帮我看看这段代码吗?


我最终得到这样的解决方案,基于迈克考可兰的建议。

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

只是遍历级标签的所有儿童(除非有没有其他的信息,你不告诉我们需要进行过滤)

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 
+0

哪里可以找到节点数据类型doc?我在LuaXML网站找不到它。 – Decula

+0

@Decula'node'不是来自luaxml的数据类型。它只是一个在循环示例中使用的变量,所以它可以在循环内引用。你可以把它命名为“children”,“value”或其他东西。 – greatwolf

+0

@greatwolf谢谢你的通知。我的意思是我想知道luaxml对象的数据类型.....有object.TAG。我想知道我可以使用哪些额外属性 – Decula

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 
+0

非常感谢你!这是一个很棒的luaxml对象教程。但迈克·科克伦真的解决了我的问题。我应该打开一个新的帖子,询问luaxml对象的解释吗?我认为其他人搜索会更容易。 – Decula