Wednesday, February 15, 2017

Happymapper(fork) - output from multiple classes

Leave a Comment

My question relates to creating output based on the documentation at https://github.com/dam5s/happymapper which is the fork of happymapper using nokogiri.

I have used 2 examples in toying with documentation. This is my example.

xml_doc = <<EOF <address location='home'>   <street>Milchstrasse</street>   <street>Another Street</street>   <housenumber>23</housenumber>   <postcode>26131</postcode>   <city>Oldenburg</city>   <country code="de">Germany</country> </address> EOF  class Address   include HappyMapper    tag 'address'    element :housenumber, Integer, :tag => "housenumber" end  class Country   include HappyMapper    tag 'country'    attribute :code, String   content :name, String  end  outputs = Country.parse(xml_doc) outputs.each do |output|   puts output.code   puts output.name   puts output.housenumber end 

Expected output

de Germany 23 

My output

sayth@sayth-E6410 ~/race (master●)$ ruby read_race.rb            [ruby-2.4.0p0] de Germany read_race.rb:49:in `block in <main>': undefined method `housenumber' for #<Country:0x0055e55facf798 @code="de", @name="Germany"> (NoMethodError)     from read_race.rb:46:in `each'     from read_race.rb:46:in `<main>' 

1 Answers

Answers 1

This is more or less direct copy/paste from the docs. I hope it gets you what you want.

The most important parts are calling Address.parse instead of Country.parse and referring to the Country fields as output.country.code instead of output.code. Then it works exactly as advertised in the readme of Happymapper.

#!/usr/bin/env ruby  require 'happymapper'  ADDRESS_XML_DATA = <<XML <root>     <address location='home'>       <street>Milchstrasse</street>       <street>Another Street</street>       <housenumber>23</housenumber>       <postcode>26131</postcode>       <city>Oldenburg</city>       <country code="de">Germany</country>     </address> </root> XML  class Country   include HappyMapper    tag 'country'    attribute :code, String   content   :name, String end  class Address   include HappyMapper    tag 'address'    has_many :streets, String, :tag => 'street'    def streets     @streets.join('\n')   end    element :postcode   , String , :tag => 'postcode'   element :housenumber, String , :tag => 'housenumber'   element :city       , String , :tag => 'city'   element :country    , Country, :tag => 'country' end  outputs = Address.parse(ADDRESS_XML_DATA) outputs.each do |output|   puts output.country.code   puts output.country.name   puts output.housenumber end 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment