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

我希望能够从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,您可能想捕获潜在的异常.

上一篇:【笔记】PYTHON3 OUTLINE


下一篇:解决得到网络流不支持查找的方案