Ich würde gerne in der Lage, eine Teilzeichenfolge aus einem MemoryStream (die stammt ursprünglich aus einer XML-Datei in einer Zip) effizient zu erhalten. Momentan lese ich den gesamten MemoryStream in einen String und suche dann nach den Start- und End-Tags des gewünschten XML-Knotens. Das funktioniert gut, aber die Textdatei kann sehr groß sein, deshalb möchte ich vermeiden, den gesamten MemoryStream in eine Zeichenkette umzuwandeln und stattdessen einfach den gewünschten Abschnitt des XML-Textes direkt aus dem Stream zu extrahieren.Get Teilstring von MemoryStream ohne Konvertierung gesamten Stream in String
Was ist der beste Weg, um darüber zu gehen?
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);
Sie könnten einen 'XmlReader' aus dem Speicherstream erstellen, um zu vermeiden, dass die gesamte Datei in den Speicher geladen wird. – juharr
@juharr: Schreiben Sie das als Antwort auf. Der andere Weg wird ein königlicher Schmerz sein und wahrscheinlich nicht richtig funktionieren. – Joshua
Welche Zip-Bibliothek ist das? Ihre aktuelle Methode extrahiert die gesamte Datei in MemoryStream, so dass es zu einer Nichtspeicherausnahme für große Dateien kommen kann. In .NET 4.5 kann ['ZipArchiveEntry.Open'] (https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry.open) verwendet werden, um [die Datei zu streamen] (http: //www.dotnetcurry.com/csharp/974/zip-archives-csharp-dotnet) – Slai