2009-06-02 11 views
14

Ho un nodo che ha due figli: un testo HTML e un elemento HTML.Come posso aggiungere un figlio a un nodo in una posizione specifica?

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

In questo caso il testo HTML è:

Installation on server 

e l'elemento HTML:

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

Ho quindi creare un nodo come questo:

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) 

Ora , per aggiungere il nodo sopra al nodo principale io uso il follow ing:

node.add_child(span_node) 

Questo accoda il nodo di span alla fine. Come posso mettere lo span_node davanti a tutti i bambini?

risposta

15

Grazie Pesto per la soluzione quasi corretta.

La soluzione di lavoro è:

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

e se non ci sono bambini? Ho trovato un workround usando un builder (http://stackoverflow.com/questions/5596210/append-elements-using-nokogirixmlbuilder). – tokland

8

È possibile utilizzare NodeSet#before in questo modo:

node.children.before(span_node) 

NodeSet#before è un metodo scorciatoia per inserire un elemento come il primo elemento. Una soluzione più generale è utilizzare Node#before e Node#after. Ad esempio, some_node.before foo aggiungerà il nodo foo come il fratello direttamente prima di some_node. Node#after è simile. Si noti che questo:

node.children.first.before(span_node) 

è quindi equivalente alla soluzione di cui sopra.

+0

Sfortunatamente, questa soluzione non fa che aumentare il contenuto (nel mio caso il testo XML MyLink) di fronte ai bambini. – Manuel

+0

Funziona per me. Supponendo che ci sia almeno un bambino esistente. –

Problemi correlati