解压缩xml文件后读取Zip :: Entry对象

时间:2014-01-15 05:24:35

标签: ruby xml nokogiri open-uri

我有一个需要解压缩和解析的外部xml文件下载。我已经下载并解压缩了它,但现在它被卡在了一个Zip :: Entry对象中,我无法用Nokogiri解析它。

require 'open-uri'
require 'zip'
require 'nokogiri'

url = 'https://download.api.bingads.microsoft.com/ReportDownload/Download.aspx?xmlfile'
zip_file = open(url)
# file pulled down successfully => tmp/localpath

unzippedxml = Zip::File.open(zip_file.path) do |z|
  xml_file = z.first
end
#output is my xml file => myxml.xml

unzippedxml.class => Zip::Entry

Nokogiri::XML("unzippedxml")
=> #<Nokogiri::XML::Document:0x212b2c0 name="document")

如何解析此文件?我创建了一个不需要解压缩的虚拟xml文件,我已经能够在控制台中解析它但我无法打开它。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

Zip::ZipFile代表整个Zip容器;您需要的是在此容器内,类Zip::ZipEntry的对象。例如,您可以使用Zip::ZipFile.read来获取具有特定名称的文件:

require 'zip/zip'

zip = Zip::ZipFile.open('some.zip')                 # open zip
xml_source = zip.read('filename_inside_zip.xml')    # read file contents

# now use the contents of xml_source with Nokogiri

或者,如果您不知道名称,但Zip中只有一个文件,您可以选择第一个:

require 'zip/zip'

zip = Zip::ZipFile.open('some.zip')                 # open zip
entry = zip.entries.reject(&:directory?).first      # take first non-directory
xml_source = entry.get_input_stream{|is| is.read }  # read file contents

# now use the contents of xml_source with Nokogiri