Hash.from_xml(来自url的xml)导致REXML :: ParseException文档没有有效的根

时间:2017-05-29 18:21:02

标签: ruby-on-rails ruby hash

我正在尝试将xml文档转换为json。

xml文件是从网址加载的:

xml = Nokogiri::XML(open(url))

通过这样的POST检索网址:

url = params[:q]

测试网址:

http://www.fitnessdelivery.nl/feeds/googleshopping.xml

导致错误的行:

puts(Hash.from_xml(xml).to_json)

整个错误(错误消息中包含的长长的产品列表除外:

The document "\n\nFitnessdelivery.nl\nhttps://www.fitnessdelivery.nl\nFitnessdelivery.nl,....... werkdag\n0\n1\n\n\n\n" does not have a valid root

我无法弄清问题是什么,以及如何解决它。

1 个答案:

答案 0 :(得分:1)

如果您运行以下内容:

url = 'http://www.fitnessdelivery.nl/feeds/googleshopping.xml'
open(url)

您将收到此错误:     RuntimeError:禁止重定向:http://www.fitnessdelivery.nl/feeds/googleshopping.xml - > https://www.fitnessdelivery.nl/feeds/googleshopping.xml

如您所见,尝试重定向。如果您将网址更改为:

https://www.fitnessdelivery.nl/feeds/googleshopping.xml

应该有效

更好的方法是捕获异常并重试:

url = 'http://www.fitnessdelivery.nl/feeds/googleshopping.xml'
uri = URI.parse(url)
tries = 3
begin
  uri.open(redirect: false)
rescue OpenURI::HTTPRedirect => redirect
  uri = redirect.uri
  retry if (tries -= 1) > 0
  raise
end

此外,Hash.from_xml需要一个字符串 - 如果不是,则会获得有效的根异常。

xml = Nokogiri::XML(open(url))
puts(Hash.from_xml(xml.to_s).to_json)