2009-06-02 8 views
14

J'ai un noeud qui a deux enfants: un texte HTML et un élément HTML.Comment puis-je ajouter un enfant à un nœud à un emplacement spécifique?

<h1 id="Installation-blahblah">Installation on server<a href="#Installation-blah" class="wiki-anchor">&para;</a> 
</h1> 

Dans ce cas, le texte HTML est:

Installation on server 

et l'élément HTML:

<a href="#Installation-blah" class="wiki-anchor">anchor;</a> 

Je crée alors un nœud comme ceci:

span_node = Nokogiri::HTML::Node.new('span',doc) 
span_node['class'] = 'edit-section' 

link_node = Nokogiri::HTML::Node.new('a',doc) 
link_node['href'] = "/wiki/#{page_id}/#{@page.title}/edit?section=#{section_index}" 
link_node['class'] = 'icon icon-edit' 
link_node.content = 'mylink' 

span_node.add_child(link_node) 

maintenant , pour ajouter le noeud ci-dessus au noeud principal j'utilise le suivant ing:

node.add_child(span_node) 

Ceci ajoute le noeud span à la fin. Comment puis-je mettre le span_node devant tous les enfants?

Répondre

15

Merci Pesto pour votre solution presque correcte.

La solution de travail est:

node.children.first.add_previous_sibling(span_node) 
+1

et s'il n'y a pas d'enfants? J'ai trouvé un workround en utilisant un constructeur (http://stackoverflow.com/questions/5596210/append-elements-using-nokogirixmlbuilder). – tokland

8

Vous pouvez utiliser NodeSet#before comme ceci:

node.children.before(span_node) 

NodeSet#before est une méthode de raccourci pour insérer un élément comme le premier élément. Une solution plus générale consiste à utiliser Node#before et Node#after. Par exemple, some_node.before foo ajoutera le noeud foo en tant que frère directement avant some_node. Node#after est similaire. Notez que ceci:

node.children.first.before(span_node) 

est donc équivalente à la solution ci-dessus.

+0

Malheureusement, cette solution ajoute que le contenu (dans mon cas, le texte XML MyLink) devant les enfants. – Manuel

+0

Fonctionne pour moi. En supposant qu'il y ait au moins un enfant existant. –

Questions connexes