我有一个需要解压缩和解析的外部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文件,我已经能够在控制台中解析它但我无法打开它。
非常感谢任何帮助!
答案 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