Nokogiri で xml2hash

実際に使ってみたら色々と残念な動作をしたので直した

def xml2hash(doc)
  result = nil
  doc.children.each do |child|
    if child.text?
      return {doc.name.to_sym => doc.content}
    elsif child.cdata?
      return {doc.name.to_sym => doc.child.content}
    elsif child.blank?
      return {doc.name.to_sym => nil}
    else
      child_result = xml2hash(child)
      key = child_result.keys[0]
      value = child_result.values[0]
      result ||= {}
      if result[key]
        result[key] = [result[key]] unless result[key].class == Array
        result[key] << value
      else
        result[key] = value
      end
    end
  end

  {doc.name.to_sym => result}
end

doc = Nokogiri::XML(@session.body) do |config|
  config.noblanks
end
p xml2hash(doc.root)