【发布时间】:2017-05-17 01:47:06
【问题描述】:
我希望能够有效地从 MemoryStream 中获取子字符串(最初来自 zip 中的 xml 文件)。目前,我将整个 MemoryStream 读取为一个字符串,然后搜索我想要的 xml 节点的开始和结束标记。这工作正常,但文本文件可能非常大,所以我想避免将整个 MemoryStream 转换为字符串,而是直接从流中提取所需的 xml 文本部分。
最好的方法是什么?
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:把它写下来作为答案。另一种方法将是一种皇家痛苦,并且可能无法正常工作。
-
那是什么压缩库?您当前的方法将整个文件提取到 MemoryStream 中,因此可能会导致大文件出现内存不足异常。在 .NET 4.5 中
ZipArchiveEntry.Open可用于stream the file -
它是 DotNetZip。我需要使用 .NET 4.0。
-
似乎您可以使用
ZipEntry.OpenReader而不是.Extract,然后在该流上使用XmlReader.Create而不是MemoryStream
标签: c# substring string-matching memorystream