2009-06-02 24 views
14

Tengo un nodo que tiene dos hijos: un texto HTML y un elemento HTML.¿Cómo puedo agregar un hijo a un nodo en una posición específica?

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

En este caso, el texto HTML es:

Installation on server 

y el elemento HTML:

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

continuación, se crea un nodo de la siguiente manera:

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) 

Ahora , para agregar el nodo anterior al nodo principal utilizo el siguiente ing:

node.add_child(span_node) 

Esto agrega el nodo span al final. ¿Cómo puedo poner el span_node frente a todos los niños?

Respuesta

15

Gracias Pesto por su solución casi correcta.

La solución de trabajo es:

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

y si no hay niños? Encontré un workround usando un generador (http://stackoverflow.com/questions/5596210/append-elements-using-nokogirixmlbuilder). – tokland

8

Puede utilizar NodeSet#before así:

node.children.before(span_node) 

NodeSet#before es un método de acceso directo para insertar un elemento como el primer elemento. Una solución más general es usar Node#before y Node#after. Por ejemplo, some_node.before foo agregará el nodo foo como el hermano directamente antes de some_node. Node#after es similar. Tenga en cuenta que esto:

node.children.first.before(span_node) 

es por lo tanto equivalente a la solución anterior.

+0

Desafortunadamente, esta solución añade sólo el contenido (en mi caso el XML mivinculo texto) delante de los niños. – Manuel

+0

Funciona para mí. Suponiendo que haya al menos un hijo existente. –

Cuestiones relacionadas