2017-02-06 19 views
5

Sorumu, çıkış noktasını, nokogiri kullanan happymapper'ın çatalı olan https://github.com/dam5s/happymapper belgesine dayanarak oluşturuyor.Happymapper (fork) - birden fazla sınıftan çıktı

Dökümantasyonda 2 örnek kullandım. Bu benim örneğim.

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 

Beklenen çıkış

de 
Germany 
23 

Benim çıkış

[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

Belki de "Ülke" sınıfına 'element: housenumber, Integer,: tag =>" housenumber "' eklemeniz gerekir. Çünkü "housenumber" adında bir yöntem tanımlamadığınız için ondan arama yapabilirsiniz. –

+0

Değil% 100 emin iyi örnekler sadece netlik değil. Bir örnekte sınıfta bir işlev oluşturuyorlar, ancak bu has_many öğeleri içindi. – sayth

cevap

3

Bu daha fazla veya daha az doğrudan kopyala/yapıştır docs arasındadır. Umarım istediğini alır.

en önemli parçaları Address.parse yerine Country.parse arama ve output.country.code yerine output.code olarak Country alanlara kastediyoruz. Daha sonra, Happymapper'ın readme'sinde ilan edildiği gibi çalışır.

#!/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

Onu çektim çünkü kodun çoğu çıktıya katkıda bulunmuyor. – sayth

+0

Kullanmıyorsanız sokaklar, posta kodu, ev numarası ve şehir ile ilgili her şeyi güvenle kaldırabilirsiniz – nus