Было бы полезно различить Node
(конкретный фрагмент структурированных XML-данных в определенном месте дерева) и «шаблон узла», который представляет собой структуру данных.
Nokogiri (и большинство других XML-библиотек) позволяет указывать только Node
s, а не шаблоны узлов. Поэтому, когда вы создали price = Nokogiri::XML::Node.new "price", @items
, у вас был определенный фрагмент данных, который принадлежит определенному месту, но еще не определил это место.
Когда вы добавили его к первому <item>
, вы определили его место. Когда вы добавили его ко второму <item>
, вы вырвали его с места и поместили на новое место. В этот момент этот Node
появился только во втором <item>
. Это продолжается, когда вы добавляете один и тот же Node
к каждому элементу, пока не достигнете последнего <item>
, где находится узел.
У Нокогири нет способа указать шаблон узла. Что вам нужно сделать, это:
@items.xpath('//items/item/manufacturer').each do |node|
price = Nokogiri::XML::Node.new "price", @items
price.content = "10"
node.add_next_sibling(price)
end