views:

849

answers:

2

Hello all,

I have a node which has two children: an XML text and an XML element.

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

In this case the XML text is:

Installation on server

and the XML element:

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

I then create a node like this:

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

link_node = Nokogiri::XML::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)

Now to add the above node to the main node we can use the following:

node.add_child(span_node)

This appends the span node at the end. How can I put the span_node in front of all children?

+2  A: 

You can use NodeSet#before like this:

node.children.before(span_node)

NodeSet#before is a short-cut method to insert an item as the first element. A more general-purpose solution is to use Node#before and Node#after. For example, some_node.before foo will add the node foo as the sibling directly before some_node. Node#after is similar. Note that this:

node.children.first.before(span_node)

is thus equivalent to the solution above.

Pesto
Unfortunately, this solution adds only the content (in my case the XML Text mylink) in front of the children.
Manuel
Works for me. Assuming there is at least one existing child.
Marc-André Lafortune
+2  A: 

Thanks Pesto for your almost correct solution.

The working solution is:

node.children.first.add_previous_sibling(span_node)
Manuel