0

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

我注意到,当我将一个节点重新分配为另一个节点的父节点时,什么也没有发生。例如,

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

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

谢谢!

4

1 回答 1

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 的良好支持,并且两者都使某些事情变得比另一个更容易,因此熟悉两者是件好事。

于 2013-04-05T23:22:13.007 回答