べるべる研究日誌

なんでもやる系エンジニアの日々

XMLからHashオブジェクトのArrayを作る

レスポンスがXMLの場合、いちいちREXMLで調べているのもめんどくさいので一気にHashオブジェクトのArrayに変換するコードをカキカキ。前にもどこかで使ったな...と思ったらY!の形態素解析を使った時でした。最近はJSONとかで受け取りできるAPIも多くなってきたけど、時々必要になるし、標準のREXMLだけで解析できるのもイイ点なので公開しておきます。簡単なXMLのレスポンスなら後で使いやすくなりますよ。

require 'rexml/document'

def xml2sym(doc)
  res = Array.new
  return res if doc.nil?
  doc.each_element{|item|
    hash = Hash.new
    item.each_element{|e|
      hash[e.name.to_sym] = e.text
    }
    res << hash
  }
  res
end

doc = REXML::Document.new(
"<result><info><title>Title1</title><data>1234</data></info>" +
"<info><title>Title2</title><data>5678</data></info></result>"
).elements['result']
data = xml2sym(doc)

dataには以下のようなHash配列のArrayが入ります

[{:title=>"Title1", :data=>"1234"}, {:title=>"Title2", :data=>"5678"}]

data.sizeとかdata.each{|d| p d[:title]}みたいに使います。レスポンスが1つだけに決まっているなら

data = xml2sym(doc)[0]

と書くと便利です。