下载并解压缩XML文件

时间:2016-12-27 23:42:25

标签: c# .net xml-parsing compression xmlreader

我想解压缩并解析位于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,settings)

上遇到异常

GZip标头中的幻数不正确。确保您传入的是GZip流

要仔细检查我是否从网络上获取格式正确的数据,我会抓住该流并将其保存到文件中:

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

在我检查1111.zip后,它看起来像一个格式良好的zip文件,带有我需要的xml。

我被告知here我根本不需要GZipStream,但如果我完全从代码中删除压缩流,并将streamContent直接传递给xml reader,我会得到一个例外:

“根级别的数据无效。第1行,第1位。”

压缩或未压缩,我仍然无法解析此文件。我做错了什么?

2 个答案:

答案 0 :(得分:2)

将流保存到本地文件夹后,使用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...

答案 1 :(得分:1)

相关文件采用PKZip格式编码,而不是GZip格式。

您需要一个不同的库来解压缩它,例如System.IO.Compression.ZipFile

您通常可以通过文件扩展名来告知编码。 PKZip文件通常使用.zip,而GZip文件通常使用.gz

请参阅:Unzip files programmatically in .net