2011-02-05 14 views
14

Bueno, tengo un problema simple con Nokogiri. Quiero hacer Nokogiri :: HTML :: Builder para hacer un fragmento de HTML de la siguiente forma:Uso de Nokogiri HTML Builder para crear un fragmento con múltiples nodos raíz

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

Cuando se trata de hacer:

@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 

Me aparece un error: Document has already a root node, que en parte lo entender. Sé que no estoy envolviendo todo en etiquetas (lo que Nokogiri espera como Nokogiri :: HTML :: Builder hereda de Nokogiri :: XML :: Builder y un documento XML debe tener un nodo raíz). Pero no estoy construyendo un documento XML.

¿Echo de menos algo? Cualquier tipo de ayuda es muy apreciada.

Respuesta

25

Como ha señalado, Builder no le permitirá compilar un documento HTML con varios nodos raíz. Tendrá que utilizar 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 
+0

+1 yo no sabía que podía Constructor aceptar documentos arbitraria. Buen trabajo. – Phrogz

+0

¡Muchas gracias Omg! Eso hizo el truco! Gracias de nuevo :) – Gerry

0

Aquí es lo que hice para la sustitución de imágenes src atributos:

doc = Nokogiri::HTML(html) 
    doc.xpath("//img").each do |img| 
    img.attributes["src"].value = Absolute_asset_path(img.attributes["src"].value) 
    end 
    doc.to_html  
Cuestiones relacionadas