2009-06-02 5 views
14

У меня есть узел, у которого есть двое детей: текст 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) 

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

node.add_child(span_node) 

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

ответ

15

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

Рабочий раствор:

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

и если детей нет? Я нашел рабочую среду с помощью построителя (http://stackoverflow.com/questions/5596210/append-elements-using-nokogirixmlbuilder). – tokland

8

Вы можете использовать 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) 

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

+0

К сожалению, это решение добавляет только содержание (в моем случае XML Text MyLink) в присутствии детей. – Manuel

+0

Работает для меня. Предполагая наличие хотя бы одного существующего ребенка. –

Смежные вопросы