【问题标题】:how to parse XML file remotely from FTP with nokogiri gem, without downloading如何使用 nokogiri gem 从 FTP 远程解析 XML 文件,无需下载
【发布时间】:2013-06-30 18:52:07
【问题描述】:
require 'net/ftp'
require 'nokogiri'

server = "xxxxxx"
user = "xxxxx"
password = "xxxxx"

ftp = Net::FTP.new(server, user, password)

files = ftp.nlst('File*.xml')

files.each do |file|
   ftp.getbinaryfile(file)
   doc = Nokogiri::XML(open(file))
   # some operations with doc
end

使用上面的代码,我可以解析/读取 XML 文件,因为它首先下载一个文件。

但是如何在不下载的情况下解析远程 XML 文件呢?

上面的代码是 rake 任务的一部分,在运行时会加载 rails 环境。


更新:

我不会创建任何文件。我将使用 mongoid 将信息导入 mongodb。

【问题讨论】:

  • 是指不创建本地文件吗? IE。将(通过 FTP)文件内容复制到本地内存是否可以接受?
  • 不,我不会创建本地文件。我将解析它并使用 mongoid 导入到 mongodb 中。我将使用此信息更新我的帖子。
  • 是否可以使用 FTP 下载将 XML 源复制到内存中,但不向本地文件系统写入任何内容,是否可以接受?这是一个重要的区别 - 解析内容而不通过 FTP 以某种方式获取它需要您在 FTP 服务器上运行一个进程,这是可能的,但要复杂得多。

标签: ruby xml-parsing nokogiri ruby-on-rails-4 net-ftp


【解决方案1】:

如果您只是想避免使用临时本地文件,可以通过提供nil 作为本地文件名直接获取文件内容作为字符串,并在内存中处理:

files.each do |file|
   xml_string = ftp.getbinaryfile( file, nil )
   doc = Nokogiri::XML( xml_string )
   # some operations with doc
end

这仍然会通过 FTP 获取内容,并且在客户端进行 XML 解析。

实际上不可能避免以某种形式或其他形式获取数据,如果 FTP 是您唯一可用的协议,那么这意味着使用 FTP get 通过网络复制数据。然而,向您的 FTP(或其他基于网络的)服务器添加功能并以其他形式返回数据是可能的,但要复杂得多。这可能包括在服务器上远程完成 Nokogiri 解析,但您仍然需要序列化最终结果、获取它并反序列化它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2017-06-08
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多