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

Nokogiri XML: trying to move image url from element to attribute

我正在尝试将大量 urls (580) 从图像元素内部移动到我的 [=40= 中图像元素 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 的研究,我尝试了很多不同的变体,下面是我最近的尝试:(不确定我在这里是否正确使用 "each"。我是 ​​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>

这对我有用:

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 returns 需要通过将属性 url 设置为 text 的值来单独修改的 Nokogiri 元素数组, 然后擦除元素的 content 。请注意,您使用 text 读取值并使用 content.

设置它