Хммм у вас есть две проблемы, распаковывая файл таким образом, который может дать вам фрагменты данных и метод, позволяющий читать XML, основываясь на возможности читать только куски за раз. Это отличается от того, как большинство из нас используется для работы с XML, где мы просто читаем его за один раз в памяти, но вы говорите, что это не вариант.
Это означает, что вам придется использовать потоки, которые строятся именно для этого случая. Это решение будет работать, но оно может быть ограничено в зависимости от того, что вы надеетесь сделать с данными XML. Вы говорите, что его нужно разбирать, но единственный способ, которым вы сможете это сделать (поскольку вы не можете сохранить его в памяти), - это прочитать его в «способе пожарного шланга», проходящем через каждый узел по мере его синтаксического анализа , Hopefull достаточно для того, чтобы вытащить нужные вам данные или обработать их, но вам тоже нужно (вытолкнуть его в БД, извлечь только те разделы, в которые вы инсталлированы, и сохранить их в меньшем объеме в XML-документе XML и т. Д.).
Итак, первое задание, получите поток из вашего zip-файла, довольно легко сделать с SharpZipLib (+1 до Rubens). Добавьте ссылку на dll SharpZipLib в свой проект. Имеет некоторый код, который создает поток из zip, а затем добавляет его в поток памяти (вы можете не захотеть сделать этот бит, но он показывает вам, как я использую его для возврата байта [] данных, вам просто нужен поток):
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using System.Diagnostics;
using System.Xml;
namespace Offroadcode.Compression
{
/// <summary>
/// Number of handy zip functions for compressing/decompressing zip data.
/// </summary>
public class Zip
{
/// <summary>
/// Decompresses a btye array of previously compress data from the Compress method or any Zip program for that matter.
/// </summary>
/// <param name="bytes">Compress data as a byte array</param>
/// <returns>byte array of uncompress data</returns>
public static byte[] Decompress(byte[] bytes)
{
Debug.Write("Decompressing byte array of size: " + bytes.Length );
using(ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream stream = new ICSharpCode.SharpZipLib.Zip.Compression.Streams.InflaterInputStream(new MemoryStream(bytes)))
{
// Left this bit in to show you how I can read from the "stream" and save the data to another stream "mem"
using (MemoryStream mem = new MemoryStream())
{
int size = 0;
while(true)
{
byte[] buffer = new byte[4096];
size = stream.Read(buffer, 0, buffer.Length);
if (size > 0)
{
mem.Write(buffer, 0, size);
}
else
{
break;
}
}
bytes = mem.ToArray();
}
}
Debug.Write("Complete, decompressed size: " + bytes.Length);
return bytes;
}
Затем, если вы будете следовать этой статье: http://support.microsoft.com/kb/301228 от MS, вы должны быть в состоянии объединить два лота кода и начать читать ваш XML из почтового потока :)
Я понимаю, что файл слишком велик, чтобы вписаться в память за один раз. Что значит «распаковать по частям»? Вы имеете в виду, как поток? – Cheeso