系统相关
首页 > 系统相关> > 从内存流中获取子字符串,而无需将整个流转换为字符串

从内存流中获取子字符串,而无需将整个流转换为字符串

作者:互联网

我希望能够从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