2014-01-15 89 views
0

我有一個需要解壓縮和解析的外部xml文件下載。我已經下載並解壓縮它,但現在它被卡住爲Zip :: Entry對象,我無法用Nokogiri解析它。解壓縮xml文件後讀取Zip :: Entry對象

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

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 

或者,如果你不知道名字,但始終有一個在拉鍊只有一個文件,你可以採取第一種:

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