XmlReader语言 - 如何在没有 System.OutOfMemoryException 的情况下读取元素中的非常长的



我必须读取从API返回的XML元素中的文件内容Base64字符串。

我的问题是这个字符串可能很长,具体取决于文件大小。

起初,我使用XmlDocument来读取 XML。现在我用XmlReader来避免 当 XML 太大时System.OutOfMemoryException

但是当我阅读字符串时,我也收到了System.OutOfMemoryException。字符串太长了,我猜。

using (XmlReader reader = Response.ResponseXmlXmlReader)
{
    bool found = false;
    //Read result
    while (reader.Read() && !found)
    {
        if(reader.NodeType == XmlNodeType.Element && reader.Name == "content")
        {
            //Read file content
            string file_content = reader.ReadElementContentAsString();
            //Write file
            File.WriteAllBytes(savepath + file.name, Convert.FromBase64String(file_content));
            //Set Found!
            found = true;
        }
    }
} 

如何在没有System.OutOfMemoryException的情况下读取带有XmlReader的文件内容字符串?

您可以使用

XmlReader.ReadElementContentAsBase64(Byte[] buffer, Int32 index, Int32 count)来实现此目的。 此方法允许在块中读取和解码 XML 元素的 Base64 元素内容,从而避免对大型元素进行OutOfMemoryException

例如,您可以引入以下扩展方法:

public static class XmlReaderExtensions
{
    public static bool ReadToAndCopyBase64ElementContentsToFile(this XmlReader reader, string localName, string namespaceURI, string path)
    {
        if (!reader.ReadToFollowing(localName, namespaceURI))
            return false;
        return reader.CopyBase64ElementContentsToFile(path);
    }
    public static bool CopyBase64ElementContentsToFile(this XmlReader reader, string path)
    {
        using (var stream = File.Create(path))
        {
            byte[] buffer = new byte[8192];
            int readBytes = 0;
            while ((readBytes = reader.ReadElementContentAsBase64(buffer, 0, buffer.Length)) > 0)
            {
                stream.Write(buffer, 0, readBytes);
            }
        }
        return true;
    }
}

然后做:

var path = Path.Combine(savepath, file.name);
var found = reader.ReadToAndCopyBase64ElementContentsToFile("content", "", path);

演示小提琴在这里。

最新更新