2010-08-10 25 views
12

Ho un HTML, che dovrebbe essere trasformato, con alcuni tag sostituiti con altri tag.Trova e sostituisci interi nodi HTML con Nokogiri

Non conosco questi tag, perché verranno da db. Quindi, i metodi set_attribute o name di Nokogiri non sono adatti per me.

ho bisogno di farlo, in un certo senso, come in questo pseudo-codice:

def preprocess_content 
    doc = Nokogiri::HTML(self.content) 
    doc.css("div.to-replace").each do |div| 
    # "get_html_text" will obtain HTML from db. It can be anything, even another tags, tag groups etc. 
    div.replace self.get_html_text 
    end 
    self.content = doc.css("body").first.inner_html 
end 

ho trovato Nokogiri::XML::Node::replace metodo. Penso che sia la giusta direzione.

Questo metodo prevede alcuni parametri node_or_tags.

Quale metodo devo utilizzare per creare un nuovo nodo dal testo e sostituire quello corrente con esso?

risposta

22

Come quella:

doc.css("div.to-replace").each do |div| 
    new_node = doc.create_element "span" 
    new_node.inner_html = self.get_html_text 
    div.replace new_node 
end 
+0

E does't lavori per me. Ho generato un errore: "nessuna analisi contestuale sui nodi non collegati". Si lamenta in questo modo per la linea, dove la proprietà "inner_html" è impostata su – AntonAL

+1

che ho appena testato e funziona nel mio ambiente. Prova a sostituire 'new_node.inner_html =' con 'new_node.content =' e ricontrolla gli errori, per favore. Dovrebbe. –

+0

Grazie, ho capito. Il problema era: modificare l'elemento ancora non collegato al DOM. Dobbiamo prima sostituire e poi modificare. È bello, ma ho affrontato un problema più confuso - non è possibile inserire alcun markup in sostituzione. Ad esempio, quando dico "new_node.inner_html ="

Test
"- funziona, ma quando dico new_node.inner_html =" ", si blocca con un messaggio" metodo non definito "bambini 'for nil: NilClass "... – AntonAL

Problemi correlati