2016-12-27 6 views
0

Я хотел бы распаковать и проанализировать файл XML, расположенного hereСкачать и распаковать XML файл

Вот мой код:

HttpClientHandler handler = new HttpClientHandler() 
{ 
    CookieContainer = new CookieContainer(), 
    UseCookies = true, 
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate, 
    // | DecompressionMethods.None, 

}; 

using (var http = new HttpClient(handler)) 
{ 

    var response = 
     http.GetAsync(@"https://login.tradedoubler.com/report/published/aAffiliateEventBreakdownReportWithPLC_806880712_4446152766894956100.xml.zip").Result; 

    Stream streamContent = response.Content.ReadAsStreamAsync().Result; 

    using (var gZipStream = new GZipStream(streamContent, CompressionMode.Decompress)) 
    { 
     var settings = new XmlReaderSettings() 
     { 
      DtdProcessing = DtdProcessing.Ignore 
     }; 

     var reader = XmlReader.Create(gZipStream, settings); 
     reader.MoveToContent(); 

     XElement root = XElement.ReadFrom(reader) as XElement; 
    } 
} 

я получаю исключение на XmlReader.Create (gZipStream, настройка)

Неверное магическое число в заголовке GZip. Убедитесь, что вы передаете в потоке GZip

Чтобы перепроверить, что я получаю правильно отформатированные данные из Интернета, я хватаю поток и сохранить его в файл:

byte[] byteContent = response.Content.ReadAsByteArrayAsync().Result; 
File.WriteAllBytes(@"C:\\temp\1111.zip", byteContent); 

После разглядываю 1111 .zip, он выглядит как хорошо отформатированный zip-файл с XML-файлом, который мне нужен.

мне посоветовали here, что мне не нужно GZipStream на всех, но если я удалить поток сжатия из кода полностью, и передать streamContent непосредственно к читателю XML, я получаю исключение:

«данных в корне уровень недействителен. Строка 1, позиция 1. "

Как сжатый, так и сжатый, я все равно не могу проанализировать этот файл. Что я делаю не так?

ответ

1

Этот файл кодируется в формате PKZip, а не GZip формате.

Для его распаковки вам понадобится другая библиотека, например System.IO.Compression.ZipFile.

Обычно вы можете указать кодировку с расширением файла. Файлы PKZip часто используют .zip, в то время как файлы GZip часто используют .gz.

См: Unzip files programmatically in .net

1

После сохранения потока в локальную папку, распаковать его с классом ZipFile. Что-то вроде этого:

byte[] byteContent = response.Content.ReadAsByteArrayAsync().Result; 
    string filename = @"C:\temp\1111.zip"; 
    File.WriteAllBytes(filename, byteContent); 

    string destinationDir = @"c:\temp"; 
    string xmlFilename = "report.xml"; 

    System.IO.Compression.ZipFile.ExtractToDirectory(filename, destinationDir); 

    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load(Path.Combine(destinationDir, xmlFilename)); 

    //xml reading goes here... 
Смежные вопросы