繁体   English   中英

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

[英]How to parse a very huge XML file from a remote server rails

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

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

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

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

任何人都可以建议可以使用哪个gem和函数来解析数据?

如果您正在使用大型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

希望能帮助到你

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

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

示例(改编自此要点 ):

require 'nokogiri'
require 'net/http'

# setup request
uri = URI("http://example.com/articles.xml")
req = Net::HTTP::Get.new(uri.request_uri)

# read response in a separate thread using a pipe to communicate
rd, wr = IO.pipe
reader_thread = Thread.new do
  Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
    http.request(req) do |response|
      response.read_body {|chunk| wr.write(chunk) }
    end
    wr.close
  end
end

# parse the incoming data chunk by chunk
reader = Nokogiri::XML::Reader(rd)
reader.each do |node|
  next if node.node_type != Nokogiri::XML::Reader::TYPE_ELEMENT
  next if node.name != "article"

  # now that we have the desired fragment, put it to use
  doc = Nokogiri::XML(node.outer_xml)
  puts("Got #{doc.text}")
end
rd.close

# let the reader thread finish cleanly
reader_thread.join

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM