2009-06-02 16 views
14

私は、HTMLテキストとHTML要素の2つの子を持つノードを持っています。ノードを特定の位置に追加するにはどうすればよいですか?

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

この場合、HTMLテキストは次のとおりです。

Installation on server 

とHTML要素:今すぐ

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) 

:私は、このようなノードを作成

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

、上記のノードをメインノードに追加するには、以下を使用しますing:

node.add_child(span_node) 

これは最後にスパンノードを追加します。 span_nodeはどのようにすべての子供の前に置くことができますか?

答えて

15

おかげであなたのほぼ正しい解決策が得られました。

実用的なソリューションは、次のとおりです。

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#beforeNode#afterを使用することです。たとえば、some_node.before fooは、some_nodeの直前に兄弟としてノードfooを追加します。 Node#afterも同様です。これは次のようになります。

node.children.first.before(span_node) 

は上記の解決方法と同等です。

+0

残念ながら、この解決策は、子供たちの前で(私の場合XMLテキストmylinkに)のみコンテンツを追加します。 – Manuel

+0

私のために働く。既存の子が少なくとも1人いると仮定します。 –

関連する問題