Using Nokogiri HTML Builder to create fragment with multiple root nodes

Gerry picture Gerry · Feb 5, 2011 · Viewed 7.8k times · Source

Well I have a simple problem with Nokogiri. I want to make Nokogiri::HTML::Builder to make an HTML fragment of the following form:

<div>
#Some stuff in here
</div>
<div>
#Some other stuff in here
</div>

When trying to do:

@builder = Nokogiri::HTML::Builder.new(:encoding => 'UTF-8') do |doc|
    doc.div {
      doc.p "first test"
    }
    doc.div {
      doc.p "second test"
    }
  end
@builder.to_html

I get an error: Document has already a root node, which I partly understand. I know I am not wrapping the whole thing into tags (which Nokogiri expects as Nokogiri::HTML::Builder inherits from Nokogiri::XML::Builder and an XML document must have a root node). But I am not building an XML document.

Am I missing something? Any kind of help is much appreciated.

Answer

michaelmichael picture michaelmichael · Feb 5, 2011

As you noted, Builder will not allow you to build an HTML document with multiple root nodes. You'll need to use DocumentFragment

@doc = Nokogiri::HTML::DocumentFragment.parse ""

Nokogiri::HTML::Builder.with(@doc) do |doc|
    doc.div {
      doc.p "first test"
    }
    doc.div {
      doc.p "second test"
    }
end

puts @doc.to_html