如何从远程服务器rails解析一个非常庞大的XML文件

时间:2016-06-29 12:04:37

标签: ruby-on-rails xml

我有一个来自远程服务器的非常大的XML,我必须解析并获取数据。

我尝试使用open()函数打开文件,但是它花了超过15分钟但仍然没有响应。

然后我尝试了Nokogiri :: XML(open(URL)),其中URL是包含要解析的数据的链接。

另外,我尝试过使用Net :: HTTP :: Get,但没有取得丰硕成果。

有人可以建议使用哪个gem和函数来解析数据吗?

2 个答案:

答案 0 :(得分:0)

如果您正在使用大型XML文件,那么您可以使用Nokogiri :: XML :: Reader类。我已成功打开1 GB文件,没有任何问题。为获得最佳性能,您可以先下载文件,然后使用服务器上的XML :: Reader类localy解析它

用法是这样的(用你的路径替换XML_FILE):

Nokogiri::XML::Reader(File.open(XML_FILE)).each do |node|
  if node.name == 'Node' && node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
    puts node.outer_xml # you can do something like this also Nokogiri::XML(node.outer_xml).at('./Node')
  end
end

Heere是文档:http://www.rubydoc.info/github/sparklemotion/nokogiri/master/Nokogiri/XML/Reader

希望有所帮助

答案 1 :(得分:0)

作为mentioned beforeNokogiri::XML::Reader是您的朋友。如果您在本地拥有该文件,则文档中的示例可以正常工作。

也可以在数据进入时完全解析数据。这涉及以块的形式获取数据(例如,使用Net::HTTP)并通过IO.pipe将其连接到transaction.commitAllowingStateLoss()

示例(改编自this gist):

<?php
$files = glob("galery/*.*");
for ($i=0; $i<count($files); $i++)
{
  $num = $files[$i];
  echo '<img class="img-display" src="'.$num.'" alt="random image">';
  }
?>