Во-первых, обратите внимание, что ваш документ, я думаю, не тот, который вы намеревались.Я подозреваю, что вы не хотели, чтобы <level1>
был самозакрывающимся, но содержал элементы <level2>
в качестве детей.
Во-вторых, я предпочитаю и защищаю Nokogiri вместо REXML.Приятно, что REXML поставляется с Ruby, но Nokogiri работает быстрее и удобнее, ИМХО.Итак:
require 'nokogiri'
test_doc = Nokogiri::XML <<EOF
<root>
<level1 key="1" value="B">
<level2 key="12" value="B" />
<level2 key="13" value="B" />
</level1>
</root>
EOF
def get_path(xml_doc, key)
xml_doc.at_xpath(key).ancestors.reverse
end
path = get_path( test_doc, "//*[@key='12']" )
p path.map{ |node| node.name }.join( '/' )
#=> "document/root/level1"