以下のような 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
正常に動作し、画面に正しい出力が表示されました。ただし、この再帰的な手順のために、結果を配列に保存しようとすると問題が発生することがわかりました。この出力を後で使用できる1つの配列に保存する方法があれば、私はうんざりしますか?
少し奇妙ですが、再帰的な方法でそれを行うのに苦労しました。それを共有したいと思います。
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