2009-06-02 30 views
14

Tôi có một nút có hai con: một văn bản HTML và một phần tử HTML.Làm cách nào để thêm con vào nút tại vị trí cụ thể?

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

Trong trường hợp này các văn bản HTML là:

Installation on server 

và các yếu tố HTML:

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

sau đó tôi tạo ra một nút như thế này:

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) 

Bây giờ , để thêm nút ở trên vào nút chính, tôi sử dụng ing:

node.add_child(span_node) 

Điều này nối thêm nút nhịp ở cuối. Làm thế nào tôi có thể đặt span_node trước mặt tất cả trẻ em?

Trả lời

15

Cảm ơn Pesto vì giải pháp gần đúng của bạn.

Các giải pháp làm việc là:

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

và nếu không có con? Tôi tìm thấy một workround bằng cách sử dụng một builder (http://stackoverflow.com/questions/5596210/append-elements-using-nokogirixmlbuilder). – tokland

8

Bạn có thể sử dụng NodeSet#before như thế này:

node.children.before(span_node) 

NodeSet#before là một phương pháp cắt ngắn để chèn một mục là yếu tố đầu tiên. Giải pháp đa năng hơn là sử dụng Node#beforeNode#after. Ví dụ: some_node.before foo sẽ thêm nút foo làm anh chị em trực tiếp trước some_node. Node#after tương tự. Lưu ý rằng điều này:

node.children.first.before(span_node) 

tương đương với giải pháp ở trên.

+0

Thật không may, giải pháp này cho biết thêm chỉ có nội dung (trong trường hợp của tôi XML chữ mylink) ở phía trước của trẻ em. – Manuel

+0

Làm việc cho tôi. Giả sử có ít nhất một đứa trẻ hiện có. –

Các vấn đề liên quan