2011-02-05 11 views
14

Cóż, mam prosty problem z Nokogiri. Chcę, aby Nokogiri :: HTML :: Builder, aby fragment HTML następującą postać:Używanie aplikacji Nokogiri HTML Builder do tworzenia fragmentów z wieloma węzłami root

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

Gdy próbuje zrobić:

@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 

pojawia się błąd: Document has already a root node, które częściowo Rozumiesz. Wiem, że nie pakuję całości w znaczniki (które Nokogiri spodziewa się, że Nokogiri :: HTML :: Builder dziedziczy po Nokogiri :: XML :: Builder, a dokument XML musi mieć węzeł główny). Ale nie buduję dokumentu XML.

Czy brakuje mi czegoś? Wszelka pomoc jest bardzo doceniana.

Odpowiedz

25

Jak zauważyłeś, Builder nie pozwoli Ci zbudować dokumentu HTML z wieloma węzłami root. Będziesz musiał użyć 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 Nie wiedziałem, że Builder może przyjąć dowolny dokument. Dobra robota. – Phrogz

+0

Omg, dziękuję bardzo! To wystarczy! Dzięki jeszcze raz :) – Gerry

0

Oto co zrobiłem do wymiany zdjęć src atrybuty:

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  
Powiązane problemy