2010-09-10 5 views
0

J'ai une page Nokogiri préparée où indésirable est enlevée ... mais les parties de texte sont stockés dans différents nœuds ...Nokogiri: Fusionner les nœuds de texte voisins récursivement?

Ce que je veux faire est de connecter tous les nœuds de texte voisin direct dans un nœud de texte. ..

ce que je suis venu avec:

#merge neighbour text nodes -> connect content 
def merge_text_nodes(node) 
    previoustext = false 
    node.children.each_with_index do |item,i| 
    if item.name != 'text()' 
     merge_text_nodes(item) 
     previoustext = false 
    else 
     if previoustext 
     node.children[i-1].inner_html += item.inner_html 
     item.remove 
     end 
     previoustext = true 
    end 
    end 
end 

Mais il ne semble pas fonctionner comme prévu - il semble ne rien faire du tout ... quelqu'un peut-il me dire comment le faire droit/montrez-moi l'erreur/la bonne façon de le faire?

Répondre

2

Ok, enfin je l'ai eu droit moi-même:

def merge_text_nodes(node) 
    prev_is_text = false 

    newnodes = [] 
    node.children.each do |element| 
    if element.text? 
     if prev_is_text 
     newnodes[-1].content += element.text 
     else 
     newnodes << element 
     end 
     element.remove 
     prev_is_text = true 
    else 
     newnodes << merge_text_nodes(element) 
     element.remove 
     prev_is_text = false 
    end 
    end 

    node.children.remove 
    newnodes.each do |item| 
    node.add_child(item) 
    end 

    return node 
end 
0

Une solution intéressante à ce problème pourrait être la suivante:

xml # your Nokogiri XML object, with unmerged text nodes 
xml = Nokogiri::XML(xml.to_xml) 

Re-analyse syntaxique du XML à partir d'une chaîne provoque nœuds de texte adjacents être fusionné en tant qu'effet secondaire.

Questions connexes