Ruby 如何使用Nokogiri移动XML中的节点?

Ruby 如何使用Nokogiri移动XML中的节点?,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,我想将nokogiri中的节点移动到父节点 我有这个: <root> <resource> <photo_1> <photo_url> img_src </photo_url> </photo_1> <adress> c/street ... </adress> &l

我想将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>
...
但不起作用。

这样就可以了:

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

我会这样做的。使用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
输出如下所示:

>> <?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>
>
>> 
>>   
>>     
>>img_src
>>       
>>     
>>c/街。。。
>>     
>>   
>> 
>>   
>>     
>>img_src
>>       
>>     
>>c/街。。。
>>     
>>   
>> 

所以您试图通过仅删除节点来转换文档?是的,就是这样,我想移到更高一级,我不知道替换。这确实更容易,+1
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>