pockestrap

Programmer's memo

REXML::Document#to_hash したい!

Rubyの標準ライブラリにあるxml、hashにするメソッドがないのよねー。
ということで作りました。
と入っても、殆ど http://rhysd.hatenablog.com/entry/20120504/1336155621 のコピペです。to_hashしたかっただけ。

# public domain
require 'rexml/document'

class ::REXML::Document
  def to_hash
    self.root.to_hash
  end
end

class ::REXML::Element
  def to_hash
    value =
      if self.has_elements? then
        children = {}
        self.each_element do |e|
          children.merge!(e.to_hash) do |k, v1, v2|
            v1.is_a?(Array) ? v1 << v2 : [v1, v2]
          end
        end
        children
      else
        self.text
      end
    {self.name.to_sym => value}
  end
end

注意点として、xmlの属性は跡形もなく消え去ります。うん。

ActiveSupportをrequireすれば同様のメソッドが手に入るらしいですが、クラスを書き換えすぎるのはなんかなーってことで書きました。Rails書いたことないから入ってなかったし…(白目

#to_hash と #to_h 、どっちがよいのだろうか…。