2017-02-06 8 views
5

Moje pytanie dotyczy tworzenia danych wyjściowych na podstawie dokumentacji pod numerem https://github.com/dam5s/happymapper, która jest widelcem happymappera przy użyciu nokogiri.Happymapper (fork) - wyjście z wielu klas

Użyłem 2 przykładów bawiących się z dokumentacją. To jest mój przykład.

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 

Oczekiwany wyjście

de 
Germany 
23 

moje wyjście

[email protected] ~/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

Być może musisz dodać 'element: housenumber, Integer,: tag =>" housenumber "' do klasy 'Country'. Ponieważ nie zdefiniowałeś metody o nazwie "numer domu", możesz z niej zadzwonić. –

+0

Nie jest w 100% pewne, że dobre przykłady nie są do końca jasne. W jednym z przykładów tworzą funkcję w klasie, ale dotyczy to elementów has_many. – sayth

Odpowiedz

3

Jest to bardziej lub mniej bezpośredni kopiuj/wklej z docs. Mam nadzieję, że dostaniesz to, czego chcesz.

Najważniejsze części wzywają Address.parse zamiast Country.parse i odnosząc się do pól Country jak output.country.code zamiast output.code. Następnie działa dokładnie tak, jak jest to reklamowane w pliku 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 
+0

Rozdzielałem to, ponieważ większość kodu do mnie nie przyczynia się do wyjścia. – sayth

+0

Możesz bezpiecznie usunąć wszystko, co dotyczy ulic, kodu pocztowego, numeru domu i miasta, jeśli go nie używasz – nus