从内存流中获取子字符串,而无需将整个流转换为字符串
作者:互联网
我希望能够从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);
解决方法:
如果您的文件是有效的xml文件,那么您应该能够使用XmlReader来避免将整个文件加载到内存中
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 xml = XmlReader.Create(ms))
{
if(xml.ReadToFollowing("someTag"))
{
xmlText = xml.ReadInnerXml();
}
else
{
// <someTag> not found
}
}
}
}
如果文件无效的xml,您可能想捕获潜在的异常.
标签:string-matching,substring,memorystream,c 来源: https://codeday.me/bug/20191111/2023055.html