c# - 从 MemoryStream 获取子字符串而不将整个流转换为字符串

标签 c# substring string-matching memorystream

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

关于c# - 从 MemoryStream 获取子字符串而不将整个流转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41435533/

相关文章:

c# - 包装/修改 Html 结果

c# - 你如何在 C# 中给命名空间一个别名

c# - NHibernate - 延迟加载原始类型

java - String.substring(i,j) 方法获取空格而不是实际字符

java - 只需在java中复制一个子字符串

python - 匹配 DataFrame 列中的字符串

c# - OwinStartupAttribute 不应该在 global.asax 和 Application_Start 之前运行吗?

javascript - 子字符串似乎不起作用

javascript - array.length 永远不会等于零并停止程序

javascript - 如何检查字符串是否包含 JavaScript 中的子字符串?