是否知道如何复制节点,然后给它一个新的父节点,目标是将副本写入新文件?
我注意到,当我将一个节点重新分配为另一个节点的父节点时,什么也没有发生。例如,
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的良好支持,并且两者都使某些事情变得比另一个更容易,因此熟悉两者是有好处的。