2009-06-02 12 views
14

Mam węzeł, który ma dwoje dzieci: tekst HTML i element HTML.Jak dodać dziecko do węzła na określonej pozycji?

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

W tym przypadku tekst HTML jest:

Installation on server 

i element HTML:

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

I następnie utworzyć węzeł takiego:

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) 

teraz , aby dodać powyższy węzeł do głównego węzła używam następującego ing:

node.add_child(span_node) 

To dołącza węzeł zakresu na końcu. Jak mogę umieścić span_node przed wszystkimi dziećmi?

Odpowiedz

15

Dzięki Pesto za prawie poprawne rozwiązanie.

roztworu roboczego:

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

i czy nie ma dzieci? Znalazłem obszar roboczy przy użyciu programu budującego (http://stackoverflow.com/questions/5596210/append-elements-using-nokogirixmlbuilder). – tokland

8

Można użyć NodeSet#before takiego:

node.children.before(span_node) 

NodeSet#before jest metodą skrót aby wstawić element jako pierwszy element. Bardziej ogólnym rozwiązaniem jest użycie Node#before i Node#after. Na przykład some_node.before foo doda węzeł foo jako rodzeństwo bezpośrednio przed some_node. Node#after jest podobna. Zauważ, że:

node.children.first.before(span_node) 

jest zatem równoważne z powyższym rozwiązaniem.

+0

Niestety, rozwiązanie to tylko dodaje zawartość (w moim przypadku Tekst MyLink XML) w obecności dzieci. – Manuel

+0

Działa dla mnie. Zakładając, że istnieje co najmniej jedno istniejące dziecko. –

Powiązane problemy