Nokogiri:复制节点并添加新的父级进行复制?

时间:2013-04-05 21:49:08

标签: 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::XML::Node.new('mom', copyofchild)

  copyofchild.parent = mom

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

  # write newdoc to file...   
end

文档页面上的一个示例显示了类似的工作,尽管它们将结构中的一个项目重新分配为同一结构中另一个项目的父项。

谢谢!

1 个答案:

答案 0 :(得分:1)

从这开始:

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 version="1.0"?>
<xml>
  <foo>
    <bar>text</bar>
  </foo>
</xml>

或者,您可以这样做:

bar = doc.at('bar')
bar.replace('<foo>' + bar.to_xml + '</foo>')

代码中的部分问题是您的XPath访问者:

"/child"

不符合你的想法。它只找到一个顶级<child>节点,而不是树中的一个节点。在我的示例XML中,它等同于<xml>节点。也许您希望//child在整个文档中找到<child>个节点。

就个人而言,我更喜欢CSS访问器而不是XPath。两者都得到了Nokogiri的很好的支持,并且两者都比另一方更容易,所以熟悉两者都很好。