Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何将子节点添加到特定位置的节点?_Xml_Ruby_Dom_Nokogiri - Fatal编程技术网

Xml 如何将子节点添加到特定位置的节点?

Xml 如何将子节点添加到特定位置的节点?,xml,ruby,dom,nokogiri,Xml,Ruby,Dom,Nokogiri,我有一个节点,它有两个子节点:一个HTML文本和一个HTML元素 <h1 id="Installation-blahblah">Installation on server<a href="#Installation-blah" class="wiki-anchor">&para;</a> </h1> 以及HTML元素: <a href="#Installation-blah" class="wiki-anchor">a

我有一个节点,它有两个子节点:一个HTML文本和一个HTML元素

<h1 id="Installation-blahblah">Installation on server<a href="#Installation-blah" class="wiki-anchor">&para;</a>
</h1>
以及HTML元素:

   <a href="#Installation-blah" class="wiki-anchor">anchor;</a>
现在,要将上述节点添加到主节点,我使用以下命令:

node.add_child(span_node)
这将在末尾追加跨度节点。如何将
span\u节点
放在所有子节点前面?

您可以这样使用:

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.children.before(span_node)
NodeSet#before
是插入项作为第一个元素的快捷方法。一个更通用的解决方案是使用和。例如,
some\u node.before foo
将把节点
foo
添加为直接位于
some\u node
之前的同级节点<代码>节点#在之后类似。请注意:

node.children.first.before(span_node)

因此相当于上述解决方案。

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

工作解决办法是:

node.children.first.add_previous_sibling(span_node)

node.prepend\u子span\u节点


不幸的是,这个解决方案只在孩子们面前添加内容(在我的例子中是XML文本mylink)。对我来说很有用。假设至少有一个现有子项。如果没有子项?我找到了一个使用生成器()的工作区。
node.children.first.add_previous_sibling(span_node)