@mirbook

Как правильно спарсить и создать nested_attribute из xml?

Уважаемые знатоки, вот вопрос:
Есть некая xml, из нее необходимо взять данные из xml и создать nested_attribute

<engines>
		<engine>
			<id>24</id>
			<properties>
				<property>
					<id_property>15</id_property>
					<value>1013</value>
				</property>
				<property>
					<id_property>13</id_property>
					<value>Рядный</value>
				</property>
				<property>
					<id_property>12</id_property>
					<value>4</value>
				</property>
				<property>
					<id_property>10</id_property>
					<value>4.76</value>
				</property>
				<property>
					<id_property>4</id_property>
					<value>74</value>
				</property>
				<property>
					<id_property>14</id_property>
					<value>Жидкостное охлаждение</value>
				</property>
				<property>
					<id_property>11</id_property>
					<value>Tier 2</value>
				</property>
				<property>
					<id_property>7</id_property>
					<value>430</value>
				</property>
			</properties>
		</engine>
</engines>


engines = @doc.xpath('/catalog/engines/engine')
engines.map do |engine|

id_property = engine.xpath('properties/property/id_property').map do |id_property|
  id_property.text.strip
end

value = engine.xpath('properties/property/value').map do |value|
  value.text.strip
end

values_attributes = [id_property, value]

puts values_attributes:
[id_property, value].transpose
  {
    property_id: id_property,
    property_value: value
  }
end


Приведенный код создает такое:
{:values_attributes=>[["15", "1013"], ["13", "Рядный"], ["12", "4"], ["10", "4.76"], ["4", "104"], ["14", "Жидкостное охлаждение"], ["11", "Tier 2"], ["7", "430"]]}

А необходимо:
values_attributes: [{property_id:'1', property_value:'2'}, {property_id:'2', property_value:'3'}]

Как это сделать?
  • Вопрос задан
  • 55 просмотров
Решения вопроса 1
oh_shi
@oh_shi
engines = @doc.xpath('/catalog/engines/engine').map do |engine|
  {
    values_attributes: engine.xpath('properties/property').map do |property|
      {
        property_id: property.xpath('id_property').text.strip,
        property_value: property.xpath('value').text.strip
      }
    end
  }
end
puts engines
{:values_attributes=>[{:property_id=>"15", :property_value=>"1013"}, {:property_id=>"13", :property_value=>"Рядный"}, {:property_id=>"12", :property_value=>"4"}, {:property_id=>"10", :property_value=>"4.76"}, {:property_id=>"4", :property_value=>"74"}, {:property_id=>"14", :property_value=>"Жидкостное охлаждение"}, {:property_id=>"11", :property_value=>"Tier 2"}, {:property_id=>"7", :property_value=>"430"}]}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
On The Spot Development Санкт-Петербург
До 4 000 $
KUPIBILET.RU Санкт-Петербург
от 150 000 ₽
от 3 000 до 4 000 $
28 февр. 2021, в 00:22
2500 руб./за проект
27 февр. 2021, в 22:14
30000 руб./за проект