Имейте элемент Ruby REXML, как показано ниже:
<a_1>
<Tests>
<test enabled='1'>trans </test>
<test enabled='1'>ac </test>
<test enabled='1'>dc </test>
</Tests>
<Corners>
<corner enabled='0'>default</corner>
<corner enabled='1'>C0 </corner>
</Corners>
</a_1>
Я хочу найти все листовые элементы, поэтому результат должен быть:
<test enabled='1'>trans </test>
<test enabled='1'>ac </test>
<test enabled='1'>dc </test>
<corner enabled='0'>default</corner>
<corner enabled='1'>C0 </corner>
Мой код:
require 'rexml/document'
include REXML
def getAllLeaf(xmlElement)
if xmlElement.has_elements?
xmlElement.elements.each {|e|
getAllLeaf(e)
}
else
return xmlElement
end
end
Он отлично работает и показывает правильные результаты на экране. Однако я обнаружил, что у меня возникла проблема, когда я пытаюсь сохранить результат в массив для этой рекурсивной процедуры. Так что мне интересно, есть ли способ сохранить этот вывод в один массив, который можно использовать впоследствии?
Я нашел рекурсивный способ сделать это, хотя и немного странный, я хотел бы поделиться им:
def getAllLeaf(eTop,aTemp=Element.new("LeafElements"))
if eTop.has_elements?
eTop.elements.each {|e|
getAllLeaf(e,aTemp)
}
else
aTemp<< eTop.dup
end
return aTemp
end