Nokogiri XML:尝试将图像URL从元素移动到属性

时间:2015-08-20 10:50:25

标签: ruby xml nokogiri

我正在尝试将大量网址(580)从图像元素内部移动到我的XML文档中图像元素的url属性的引号内。

以下是一个例子:

我现在所拥有的:

<image type="photo" url="">http://contentadmin.livebookings.com/dynamaster/image_archive/original/f24c60a52e7ac0874be57e51bce30726.jpg</image>

我想将其更改为:

<image type="photo" url="http://contentadmin.livebookings.com/dynamaster/image_archive/original/f24c60a52e7ac0874be57e51bce30726.jpg"></image>

我仔细查看了修改部分下的Nokogiri文档:http://www.nokogiri.org/tutorials/modifying_an_html_xml_document.html但他们并没有专门处理属性。

我还研究了之前的Stack Overflow问题:Setting an attribute in a Nokogiri::XML::NodeSet with css

根据我对Nokogiri的研究,我尝试了很多不同的变化,下面是我的最新尝试:(不确定我是否正在使用&#34;每个&#34;在这里正确。我是css选择器Nokogiri对我来说似乎比xpath更直接。

require 'nokogiri'

f = File.read('xml-output-no-error-version.xml')

doc = Nokogiri::XML(f)

actual_links = doc.css('image').text

link_elements = doc.css('image')

link_attributes = link_elements["url"]

actual_links.each do |l|
  l.link_attributes
end

File.write('new-xml-output.xml', doc.to_xml)

我在控制台中收到此错误:

ruby nokogiri.rb
nokogiri.rb:11:in `[]': no implicit conversion of String into Integer (TypeError)
    from nokogiri.rb:11:in `<main>'

以下是我的XML文档中更完整的代码段:

<?xml version="1.0" encoding="UTF-8"?>
<listings>
<language>en</language>
<listing>
<id>43927</id>
<cell1>Andover House</cell1>
<cell2>28-30 Camperdown</cell2>
<cell3>Great Yarmouth</cell3>
<cell4>NR30 3JB</cell4>
<cell5>GB</cell5>
<cell6>52.6003767</cell6>
<cell7>1.7339649</cell7>
<cell8>+44 1493843490</cell8>
<category>Restaurants - British</category>
<image type="photo" url="">http://contentadmin.livebookings.com/dynamaster/image_archive/original/f24c60a52e7ac0874be57e51bce30726.jpg</image>
<cell11>http://www.bookatable.co.uk/andover-house-great-yarmouth-norfolk
</cell11>
</listing>
...
</listings>

1 个答案:

答案 0 :(得分:1)

这对我有用:

require 'nokogiri'

f = File.read('xml-output-no-error-version.xml')

doc = Nokogiri::XML(f)

link_elements = doc.css('image')

link_elements.each do |l|
  l['url'] = l.text
  l.content = ''
end

File.write('new-xml-output.xml', doc.to_xml)

非常简短地调用css会返回一个Nokogiri元素数组,需要通过将属性url设置为text的值来单独修改,然后通过消除元素的content。请注意,您使用text阅读了该值,并使用content设置了它。