Как я могу добавить дочерний элемент к узлу в определенной позиции?

У меня есть узел с двумя дочерними элементами: HTML-текст и HTML-элемент.

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

В этом случае текст HTML:

Installation on server 

и элемент HTML:

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

Затем я создаю узел следующим образом:

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)

Теперь, чтобы добавить вышеуказанный узел к основному узлу, я использую следующее:

node.add_child(span_node)

Это добавляет узел span в конце. Как я могу поставить span_node перед всеми детьми?


person Manuel    schedule 02.06.2009    source источник


Ответы (3)


Спасибо Песто за ваше почти правильное решение.

Рабочее решение:

node.children.first.add_previous_sibling(span_node)
person Manuel    schedule 03.06.2009
comment
а если нет детей? Я нашел обходной путь с помощью компоновщика (stackoverflow.com/questions/5596210/ ). - person tokland; 21.05.2011

Вы можете использовать NodeSet#before следующим образом:

node.children.before(span_node)

NodeSet#before — это метод быстрого доступа для вставки элемента в качестве первого элемента. Более универсальное решение — использовать Node#before и Node#after. Например, some_node.before foo добавит узел foo в качестве брата непосредственно перед some_node. Node#after похоже. Обратите внимание, что это:

node.children.first.before(span_node)

таким образом, эквивалентно приведенному выше решению.

person Pesto    schedule 02.06.2009
comment
К сожалению, это решение добавляет только контент (в моем случае XML Text mylink) перед дочерними элементами. - person Manuel; 03.06.2009
comment
Работает на меня. Предполагая, что существует по крайней мере один существующий ребенок. - person Marc-André Lafortune; 07.09.2010

node.prepend_child span_node

Документация Nokogiri::XML::Node#prepend_child

person John Doe    schedule 06.08.2015