2011-06-05 19 views
2

我想將nokogiri中的節點移動到父節點。如何使用Nokogiri在XML中移動節點?

我有這樣的:

<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

所以,你試圖通過消除只有節點轉換文檔? – 2011-06-05 14:01:18

+0

是的,這就是它我想要上一級 – Darkonen 2011-06-05 17:51:26

回答

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> 
+0

這個作品也完美,也許是easer,謝謝 – Darkonen 2011-06-07 06:27:04

+0

我不知道替換。這確實更容易,+1 – 2011-06-07 23:02:03

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 
+0

這個作品非常完美,謝謝 – Darkonen 2011-06-07 06:26:46