Добавление элементов с помощью Nokogiri::XML::Builder

#ruby #xml #nokogiri

#ruby #xml #nokogiri

Вопрос:

У меня есть следующий код:

 builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
  xml.myRoot do |xml|
    xml.oneChild
    xml.anotherChild
  end
end
  

Теперь я хочу добавить несколько дочерних узлов к myRoot с помощью builder (на втором шаге я знаю, как их сразу добавить). Как я могу это сделать?

Я пробовал это:

 node = builder.doc.xpath('//myRoot/oneChild').first
Nokogiri::XML::Builder.with(node) do |xml|
  xml.childOfOneChild 'Im a child of oneChild'
end
  

Что не работает. Они не будут привязываться к элементу, это просто пустой дочерний элемент.

Ответ №1:

Ваш код выдает следующий XML, который, похоже, соответствует вашим спецификациям. Во всяком случае, это не приводит к созданию пустого oneChild файла. Если это не то, что вы ищете, можете ли вы сказать нам, каким был бы ваш идеальный результат?:

 builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
  xml.myRoot do |xml|
    xml.oneChild
    xml.anotherChild
  end
end

puts builder.to_xml

# <?xml version="1.0" encoding="UTF-8"?>
# <myRoot>
#   <oneChild/>
#   <anotherChild/>
# </myRoot>   

node = builder.doc.xpath('//myRoot/oneChild').first
Nokogiri::XML::Builder.with(node) do |xml|
  xml.childOfOneChild 'Im a child of oneChild'
end

puts builder.to_xml

# <?xml version="1.0" encoding="UTF-8"?>
# <myRoot>
#   <oneChild>
#     <childOfOneChild>Im a child of oneChild</childOfOneChild>
#   </oneChild>
#   <anotherChild/>
# </myRoot>
  

Комментарии:

1. Интересно, где находится OP? у меня это сработало, большое спасибо. документация: rdoc.info/github/tenderlove/nokogiri/master/Nokogiri/XML /…