Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Append elements using Nokogiri::XML::Builder

Tags:

xml

ruby

nokogiri

I have the following code:

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

Now I want to append a few child nodes to myRoot using the builder (in a second step, I know how to append them straight away). How can I do that?

I've tried this:

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

Which doesn't work. They won't stick to the element, it's just an empty oneChild.

like image 341
sandstrom Avatar asked Apr 08 '11 14:04

sandstrom


1 Answers

Your code produces the following XML, which seems to meet your specifications. It doesn't produce an empty oneChild, at any rate. If this isn't what you're looking for, can you tell us what your ideal output would be?:

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>
like image 143
michaelmichael Avatar answered Oct 24 '22 01:10

michaelmichael