How do I convert XML into a hash in Rails?

后端 未结 5 1781
北海茫月
北海茫月 2021-01-05 08:28

How do I convert an XML body to a hash in Ruby?

I have an XML body which I\'d like to parse into a hash


    
           


        
5条回答
  •  被撕碎了的回忆
    2021-01-05 09:20

    I used to use XML::Simple in Perl because parsing XML using Perl was a PITA.

    When I switched to Ruby I ended up using Nokogiri, and found it to be very easy to use for parsing HTML and XML. It's so easy that I think in terms of CSS or XPath selectors and don't miss a XML-to-hash converter.

    require 'ap'
    require 'date'
    require 'time'
    require 'nokogiri'
    
    xml = %{
    
        
            
                2010-11-10T09:00:00
                2010-11-10T09:20:00
            
            
                2010-11-10T09:20:00
                2010-11-10T09:40:00
            
            
                2010-11-10T09:40:00
                2010-11-10T10:00:00
            
            
                2010-11-10T10:00:00
                2010-11-10T10:20:00
            
            
                2010-11-10T10:40:00
                2010-11-10T11:00:00
            
        
    
    }
    
    time_data = []
    
    doc = Nokogiri::XML(xml)
    doc.search('//TIME_DATA').each do |t|
      start_time = t.at('StartTime').inner_text
      end_time = t.at('EndTime').inner_text
      time_data << {
        :start_time => DateTime.parse(start_time),
        :end_time   => Time.parse(end_time)
      }
    end
    
    puts time_data.first[:start_time].class
    puts time_data.first[:end_time].class
    ap time_data[0, 2]
    

    with the output looking like:

    DateTime
    Time
    [
        [0] {
            :start_time => #,
              :end_time => 2010-11-10 09:20:00 -0700
        },
        [1] {
            :start_time => #,
              :end_time => 2010-11-10 09:40:00 -0700
        }
    ]
    

    The time values are deliberately parsed into DateTime and Time objects to show that either could be used.

提交回复
热议问题