LoginSignup
3
3

More than 5 years have passed since last update.

NokogiriでXML文字列からHashを生成する

Posted at

元ネタは https://gist.github.com/2986414/32a6c6cb9a9cc99e96f4cd9026513d0644ba0511 ここ。
2年前のものだったのでNokogiri 1.5.0で動くように改修。Hash classを拡張。

xml2hash.rb
# USAGE: Hash.from_libxml(YOUR_XML_STRING)
# http://movesonrails.com/articles/2008/02/25/libxml-for-active-resource-2-0
require 'nokogiri'

class Hash
  class << self
    def from_libxml(xml)
      begin
        result = Nokogiri::XML(xml)
        return { result.root.name.to_s.to_sym => xml_node_to_hash(result.root)}
      rescue Exception => e
        # raise your custom exception here
      end
    end


    def xml_node_to_hash(node)
      # If we are at the root of the document, start the hash
      if node.element?
        if node.children.present?
          result_hash = {}

          node.children.each do |child|
            result = xml_node_to_hash(child)

            if child.name == "text"
              if !child.next_element.present? and !child.previous_element.present?
                return result
              end
            elsif result_hash[child.name.to_sym]
              if result_hash[child.name.to_sym].is_a?(Object::Array)
                result_hash[child.name.to_sym] << result
              else
                result_hash[child.name.to_sym] = [result_hash[child.name.to_sym]] << result
              end
            else
              result_hash[child.name.to_sym] = result
            end
          end
          return result_hash
        elsif node.attributes.present?
          # TODO
        else
          return nil
        end
      else
        return node.content.to_s
      end
    end
  end
end

attributesが入り組んでいると取れないのだけど簡単な構造ならHash化できる

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3