Как мне переместить узлы в XML с помощью Nokogiri? - PullRequest
2 голосов
/ 05 июня 2011

Я хочу переместить узлы в нокогири к родителю.

У меня есть это:

<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

Но не работает.

Ответы [ 2 ]

2 голосов
/ 07 июня 2011

Вот как бы я это сделал.Используя ваш 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

Вывод выглядит так:

0 голосов
/ 07 июня 2011

Это сделает это:

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