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

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

谢谢!

从这个开始:

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

最新更新