2012-12-27 12 views
5

Ho un generatore Nokogiri esistente e alcuni nodi xml in una stringa da un'altra origine. Come posso aggiungere questa stringa al mio builder?Come aggiungere una stringa XML a 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 

Questo sfugge str in qualcosa di simile:

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" 

ho trovato molte, molte cose simili, tra cui nidificazione costruttori e utilizzando l'operatore < <, ma non funziona niente per inserire un albero nodo XML completi in un blocco costruttore. Come posso trasformare quella stringa in nodi reali?

risposta

10

Quali problemi hai riscontrato utilizzando <<? Questo funziona per me:

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

ed eviti di utilizzare il metodo privato insert.

0

E, come al solito, ho trovato la risposta breve dopo la pubblicazione ...

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 

Ti dà

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

EDIT: In questo modo ha funzionato per me quando < < riuscito per qualche motivo sconosciuto . Tuttavia, come altri hanno sottolineato, funziona direttamente accedendo al metodo: insert che doveva essere protetto. Consideralo sia come "cattiva pratica" che come ultima risorsa.

+0

Lo sta facendo nel modo più difficile. Vedere la risposta fornita da @matt, che utilizza l'operatore ['<<'] (http://nokogiri.org/Nokogiri/XML/Builder.html#method-i-CCC) per aggiungere XML non elaborato. –

+0

un aggiornamento nokogiri gem e un bundle più tardi e la sintassi @matt funziona alla grande. Non so cosa dire perché ho provato ad usare << tanti modi prima! – genkilabs

+0

È una buona idea mantenere le tue gemme aggiornate nel mondo Ruby. Dove saremmo rimasti indietro rispetto al margine sanguinante in altre lingue, spesso è bene rimanere abbastanza aggiornati con Ruby. –

Problemi correlati