Я хотел бы иметь возможность эффективно получать подстроку из MemoryStream (первоначально из XML-файла в zip-файле). В настоящее время я читаю весь MemoryStream для строки, а затем ищем начальные и конечные теги узла xml, которого я хочу. Это прекрасно работает, но текстовый файл может быть очень большим, поэтому я хотел бы избежать преобразования всего MemoryStream в строку и вместо этого просто извлечь желаемый раздел XML-текста непосредственно из потока.Получите подстроку из MemoryStream без преобразования всего потока в строку
Каков наилучший способ для этого?
string xmlText;
using (var zip = ZipFile.Read(zipFileName))
{
var ze = zip[zipPath];
using (var ms = new MemoryStream())
{
ze.Extract(ms);
ms.Position = 0;
using(var sr = new StreamReader(ms))
{
xmlText = sr.ReadToEnd();
}
}
}
string startTag = "<someTag>";
string endTag = "</someTag>";
int startIndex = xmlText.IndexOf(startTag, StringComparison.Ordinal);
int endIndex = xmlText.IndexOf(endTag, startIndex, StringComparison.Ordinal) + endTag.Length - 1;
xmlText = xmlText.Substring(startIndex, endIndex - startIndex + 1);
Вы можете создать «XmlReader» из потока памяти, чтобы избежать загрузки всего файла в память. – juharr
@juharr: Напишите это как ответ. Другой путь - это королевская боль и, вероятно, не работает правильно. – Joshua
Что такое zip-библиотека? Ваш текущий метод извлекает весь файл в MemoryStream, поэтому это может привести к исключению из памяти больших файлов. В .NET 4.5 ['ZipArchiveEntry.Open'] (https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry.open) можно использовать для [потока файла] (http: //www.dotnetcurry.com/csharp/974/zip-archives-csharp-dotnet) – Slai