にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

REXMLで同名の要素を全部まとめて取り出す

例えば、

<!-- sample.xml -->
<foo>
  <bar attr="1"/>
  <bar attr="2"/>
  <bar attr="3"/>
</foo>

みたいなXMLがあって、名前がbarの要素を取り出すには当然の如く、

require 'rexml/document'
doc = REXML::Document.new(File.open("sample.xml").read)
elems = doc.root.elements["foo/bar"]
# なんかの処理

とすれば、elemsにはbar要素が配列になって返ってくるものだと思ったのですが、これだと単に最初のbar要素が返ってくるだけでした。
まとめて配列で返して欲しいと思ってもどうやらまんまのメソッドはないようす。
なので、

require 'rexml/document'
doc = REXML::Document.new(File.open("sample.xml").read)
doc.root.elements.each("//bar") do |elem|
  # なんかの処理
end

として辛うじて目的達成。
# 勢いで書いたので上記コードは未動作確認