16

我有一个节点,它有两个子节点:一个 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所有孩子的面前?

4

3 回答 3

17

感谢 Pesto 提供几乎正确的解决方案。

工作解决方案是:

node.children.first.add_previous_sibling(span_node)
于 2009-06-03T08:00:24.370 回答
9

你可以NodeSet#before这样使用:

node.children.before(span_node)

NodeSet#before是一种将项目作为第一个元素插入的快捷方法。更通用的解决方案是使用Node#beforeNode#after。例如,some_node.before foo将节点foo作为兄弟节点添加到some_node. Node#after类似。请注意:

node.children.first.before(span_node)

因此等价于上面的解决方案。

于 2009-06-02T15:18:33.073 回答
8

node.prepend_child span_node

Nokogiri::XML::Node#prepend_child 文档

于 2015-08-06T12:16:42.233 回答