2010-08-10 4 views
12

J'ai un HTML, qui devrait être transformé, ayant des balises remplacées par d'autres balises.Trouver et remplacer des nœuds HTML entiers avec Nokogiri

Je ne connais pas ces balises, car elles proviendront de db. Donc, set_attribute ou name les méthodes de Nokogiri ne me conviennent pas.

je besoin de le faire, d'une manière, comme dans ce pseudo-code:

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 

Je trouve la méthode Nokogiri::XML::Node::replace. Je pense que c'est la bonne direction.

Cette méthode attend un paramètre node_or_tags.

Quelle méthode devrais-je utiliser pour créer un nouveau nœud à partir du texte et remplacer celui-ci par celui-ci?

Répondre

22

Comme ça:

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

Il does't fonctionne pour moi. Je gen une erreur: "pas d'analyse contextuelle sur les nœuds non liés". Il se plaint de cette façon pour la ligne, où la propriété "inner_html" est définie – AntonAL

+1

Je viens de tester, et cela fonctionne dans mon environnement. Essayez de remplacer 'new_node.inner_html =' par 'new_node.content =' et vérifiez s'il y a des erreurs, s'il vous plaît. Cela devrait. –

+0

Merci, je l'ai compris. Le problème était - modifiant mais élément non lié au DOM. Nous devons d'abord remplacer, puis modifier. C'est bien, mais j'ai fait face à un problème plus confus - aucun balisage ne peut être inséré en remplacement. Par exemple, quand je dis "new_node.inner_html ="

Test
"- cela fonctionne, mais quand je dis new_node.inner_html =" ", il se bloque avec un message" méthode non définie 'enfants 'for nil: NilClass' ... – AntonAL

Questions connexes