Ruby Nokogiri:复制节点并将新父节点添加到副本?

Ruby Nokogiri:复制节点并将新父节点添加到副本?,ruby,copy,nokogiri,parent,Ruby,Copy,Nokogiri,Parent,你知道如何复制一个节点,然后给它一个新的父节点,目的是将副本写入一个新文件吗 我注意到,当我将一个节点重新指定为另一个节点的父节点时,什么都没有发生。比如说, doc.xpath("/child").each do|child| # copy node to new structure. also tried dup() copyofchild = child # create new node to become newdoc's parent mom = Nokogiri

你知道如何复制一个节点,然后给它一个新的父节点,目的是将副本写入一个新文件吗

我注意到,当我将一个节点重新指定为另一个节点的父节点时,什么都没有发生。比如说,

doc.xpath("/child").each do|child|

  # copy node to new structure. also tried dup()
  copyofchild = child

  # create new node to become newdoc's parent
  mom = Nokogiri::XML::Node.new('mom', copyofchild)

  copyofchild.parent = mom

  puts copyofchild  # lists <child>...</child>, not <mom><child>...</child></mom>

  # write newdoc to file...   
end
doc.xpath(“/child”)。每个都有子|
#将节点复制到新结构。还尝试了dup()
copyofchild=儿童
#创建新节点以成为newdoc的父节点
mom=Nokogiri::XML::Node.new('mom',copyofchild)
copyofchild.parent=妈妈
将复制的儿童列表…而不是。。。
#将newdoc写入文件。。。
结束
“文档”页面上的一个示例显示了类似的工作方式,尽管它们将结构中的一个项目重新分配为同一结构中另一个项目的父项

谢谢

从这个开始:

require 'nokogiri'

xml = '<xml><bar>text</bar></xml>'
doc = Nokogiri::XML(xml)

bar = doc.at('bar')
bar.parent.children = '<foo>' + bar.to_xml + '</foo>'
puts doc.to_xml
不做你想做的事。它只找到顶级的
节点,而不是树中更远的节点。在我的示例XML中,它相当于
节点。也许您需要查找整个文档中节点的
//child


就个人而言,我更喜欢CSS访问器而不是XPath。两者都得到了Nokogiri的很好的支持,并且两者都使某些事情比另一个更容易,因此熟悉两者很好。

谢谢。字符串串联起作用。我使用的XPath实际上是正确的;我在寻找原始父节点之外的所有“子”节点。(显然,节点名称已更改以说明这一点。)如果不想使用序列化/反序列化,可以执行以下操作:
bar.replace(“”)
<?xml version="1.0"?>
<xml>
  <foo>
    <bar>text</bar>
  </foo>
</xml>
bar = doc.at('bar')
bar.replace('<foo>' + bar.to_xml + '</foo>')
"/child"