2012-12-27 24 views
5

Mam istniejący builder Nokogiri i kilka węzłów xml w ciągu znaków z innego źródła. Jak mogę dodać ten ciąg do mojego programu budującego?Jak dodać łańcuch XML do Nokogiri Builder

str = "<options><cc>true</cc></options>" 
xml = Nokogiri::XML::Builder.new do |q| 
    q.query do |f| 
    f.name "awesome" 
    f.filter str 
    end 
end 

Ten ucieka str w coś podobnego:

xml.to_xml 
=> "<?xml version=\"1.0\"?>\n<query>\n <name>awesome</name>\n <filter>&lt;options&gt;&lt;cc&gt;true&lt;/cc&gt;&lt;/options&gt;</filter>\n</query>\n" 

Znalazłem wiele, wiele podobnych rzeczy, w tym lęgowych budowniczych i za pomocą operatora < <, ale nic nie działa, aby wstawić drzewa węzła pełny xml do bloku budowniczego. Jak mogę uczynić ten ciąg na prawdziwych węzłach?

Odpowiedz

10

Jakie problemy napotkano przy użyciu <<? Działa to dla mnie:

xml = Nokogiri::XML::Builder.new do |q| 
    q.query do |f| 
    f.name "awesome" 
    f << str 
    end 
end 

i unika używania prywatnej metody insert.

0

I, jak zwykle, znalazłem odpowiedź zaraz po zaksięgowaniu ...

xml = Nokogiri::XML::Builder.new do |q| 
    q.query do |f| 
    f.name "awesome" 
    f.__send__ :insert, Nokogiri::XML::DocumentFragment.parse(str) 
    end 
end.to_xml 

Daje

=> "<?xml version=\"1.0\"?>\n<query>\n <name>awesome</name>\n <options>\n <cc>true</cc>\n </options>\n</query>\n" 

EDIT: W ten sposób pracował dla mnie, gdy < < powiodło się z jakiegoś nieznanego powodu . Jednak, jak wskazali inni, działa on bezpośrednio, poprzez bezpośredni dostęp do metody: insert, która miała być chroniona. Rozważ to zarówno "złą praktykę", jak i ostatnią deskę ratunku.

+0

Robi to na własnej skórze. Zobacz odpowiedź @matt, która używa operatora ['<<'] (http://nokogiri.org/Nokogiri/XML/Builder.html#method--3C-3C) do dołączania surowego XML. –

+0

Jedna aktualizacja klejnotu nokogiri i pakiet później, a składnia @matt działa świetnie. Nie wiem, co powiedzieć, ponieważ wcześniej próbowałem użyć << wiele sposobów! – genkilabs

+0

To całkiem niezły pomysł, aby zaktualizować swoje klejnoty w świecie Ruby. Tam, gdzie pozostawaliśmy w tyle za krwawiącymi krawędziami w innych językach, często dobrze jest być z Rubim na bieżąco. –

Powiązane problemy