Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I move nodes in XML using Nokogiri?

Tags:

xml

ruby

nokogiri

I want to move nodes in nokogiri to a parent.

I have this:

<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>
...

What I want to achieve for each node is:

   <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

With this code it only does the first node but not the other I also tried with:

@doc.xpath('//resource').each do |node|
    h1  = node.at_css "photo_url"
    div = @doc.at_css "resource"
    h1.parent=div

end

But doesn't work.

like image 200
Darkonen Avatar asked Jan 28 '26 22:01

Darkonen


1 Answers

Here's how I'd do it. Using your 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

Here's the code:

require 'nokogiri'
doc = Nokogiri::XML(xml)

doc.search('photo_url').each do |n|
  n.parent.replace n
end

puts doc.to_xml

The output looks like:

>> <?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>
like image 133
the Tin Man Avatar answered Jan 30 '26 15:01

the Tin Man



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!