(我有XML格式的文件)
<root>
<!-- level 1 nesting -->
<main name="A" category="group">
<sub name="A.1"></sub>
</main>
<!-- level 1 nesting -->
<main name="B" category="group">
<sub name="B.1"></sub>
</main>
<!-- level 1 nesting -->
<main name="C" category="group">
<sub name="C.1"></sub>
</main>
<!-- level 1 nesting -->
<main name="D" category="group">
<sub name="D.1"></sub>
</main>
<!-- level 2 nesting -->
<main name="E" category="group">
<sub name="E.1" category="group">
<sub name="E.1.1"></sub>
</sub>
</main>
<!-- level n nesting - this is what I need help with -->
<main name="E" category="group">
[...]
</main>
</root>
main
的标签(sub
或category
)都表示它有孩子"group"
,其余的标签均为main
,无论嵌套深度如何sub
在调用自身之后,当前迭代终止(如预期的那样)并更深一层。但是,由于我不再知道它们从哪里开始,所以现在无法关闭
def recursiveLoop(group)
str = ""
group.each { |g|
str += "<ul>"
str += "<li>#{g.attribute("name")}"
if g.attribute("category").to_s == "group"
recursiveLoop(g.css("sub"))
else
str += "</li></ul>"
end
}
return str
end
或<li>
标签。
答案 0 :(得分:2)
这有效
def recursiveLoop(group)
str = ""
group.each { |g|
str += "<li>#{g.attribute("name")}"
if g.attribute("category").to_s == "group"
str += "<ul>"
str += recursiveLoop(g.css("> sub"))
str += "</ul>"
end
str += "</li>"
}
return str
end
不过有两件事:
<ul>
的结果周围有一个主要的</ul>
和recursiveLoop
标签。像这样:<%= sanitize "<ul>" + recursiveLoop(@groups) + "</ul>" %>
这只是提供一个根节点而不会缠结在其他对象上。
> sub
的css选择器中指定g
(忘了我使用Nokogiri)以将所有子项限制为它们的立即父母。答案 1 :(得分:1)
正如@simplelime所说,您可以将close tag
放在if block
之后,并将函数的返回值连接到相同的初始str
,这样您将获得所有每个主节点内的递归子代;在执行结束时,它将返回大的结果字符串。
def recursiveLoop(group)
str = ""
group.each { |g|
str += "<ul>"
str += "<li>#{g.attribute("name")}"
if g.attribute("category").to_s == "group"
str += recursiveLoop(g.css("sub"))
end
str += "</li></ul>"
}
return str
end