ruby - convert - Happymapper(fork)-salida de múltiples clases
parse xml nokogiri (1)
Esto es más o menos directo copiar / pegar de los documentos. Espero que te traiga lo que quieres.
Las partes más importantes son llamar a Address.parse
lugar de Country.parse
y hacer referencia a los campos de Country
como output.country.code
lugar de output.code
. Luego funciona exactamente como se anuncia en el archivo léame de 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
Mi pregunta se relaciona con la creación de resultados basados en la documentación en https://github.com/dam5s/happymapper, que es la bifurcación de happymapper que usa nokogiri.
He usado 2 ejemplos para jugar con la documentación. Este es mi ejemplo.
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
Rendimiento esperado
de
Germany
23
Mi salida
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>''