我希望能夠從MemoryStream(最初來自zip中的xml文件)中有效地獲取子字符串。目前,我將整個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