[英]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.