我想将nokogiri中的节点移动到父节点。
我有这个:
<root>
<resource>
<photo_1>
<photo_url>
img_src
</photo_url>
</photo_1>
<adress>
c/street ...
</adress>
</resource>
<resource>
<photo_1>
<photo_url>
img_src
</photo_url>
</photo_1>
<adress>
c/street ...
</adress>
</resource>
...
我想为每个节点实现的目标是:
<resource>
<photo_url>
img_src
</photo_url>
<adress>
c/street ...
</adress>
</resource>
h1 = @doc.at_css "photo_url"
div = @doc.at_css "resource"
h1.parent=div
使用此代码,它只执行第一个节点而不是另一个节点,我也尝试过:
@doc.xpath('//resource').each do |node|
h1 = node.at_css "photo_url"
div = @doc.at_css "resource"
h1.parent=div
end
但是不起作用。
答案 0 :(得分:2)
我是这样做的。使用您的XML:
xml = <<EOT
<root>
<resource>
<photo_1>
<photo_url>
img_src
</photo_url>
</photo_1>
<adress>
c/street ...
</adress>
</resource>
<resource>
<photo_1>
<photo_url>
img_src
</photo_url>
</photo_1>
<adress>
c/street ...
</adress>
</resource>
</root>
EOT
以下是代码:
require 'nokogiri'
doc = Nokogiri::XML(xml)
doc.search('photo_url').each do |n|
n.parent.replace n
end
puts doc.to_xml
输出如下:
>> <?xml version="1.0"?>
>> <root>
>> <resource>
>> <photo_url>
>> img_src
>> </photo_url>
>> <adress>
>> c/street ...
>> </adress>
>> </resource>
>>
>> <resource>
>> <photo_url>
>> img_src
>> </photo_url>
>> <adress>
>> c/street ...
>> </adress>
>> </resource>
>> </root>
答案 1 :(得分:0)
这样做:
doc = Nokogiri::XML(xml)
doc.xpath('//photo_url').each do |photo|
old_parent = photo.xpath('ancestor::*[1]').first
resource = photo.xpath('ancestor::resource').first
photo.parent = resource
old_parent.remove
end