读取从zip下载并加载到MemoryStream中的大型Xml文件

本文关键字:大型 Xml 文件 MemoryStream zip 下载 加载 读取 | 更新日期: 2023-09-27 18:10:36

我正在阅读非常大的Xml文件(400+ MB), 15 MB压缩后下载并解压缩到MemoryStream。我每次都会遇到一个System.OutOfMemoryException。我尝试使用StreamReader.ReadToEnd()并将其读取为字符串,不工作。

我搜索了一下,我使用XmlReader并将其加载到XElement中,正如这里的帖子所建议的那样。但是,我仍然遇到OutOfMemoryException错误。

string downloadUrl = requestStatus.ReportDownloadUrl;
//create a network stream to the report Url
using (Stream reportZipStream = new WebClient().OpenRead(downloadUrl)) //download the file
using (Stream reportZipMemoryStream = new MemoryStream()) //initilize zip memorystream
using (Stream reportXmlStream = new MemoryStream()) //load xml file to memorystream for manipulation
{
    //copy zip file to memorystream
    reportZipStream.CopyTo(reportZipMemoryStream);
    reportZipMemoryStream.Seek(0, SeekOrigin.Begin);
    //unzip to Xml memory stream
    using (ZipFile reportZip = ZipFile.Read(reportZipMemoryStream))
    {
        reportZip[0].Extract(reportXmlStream);
    }
    reportXmlStream.Seek(0, SeekOrigin.Begin);
    Dictionary<string, object> parsedXml = default(Dictionary<string, object>);
    //read and parse
    if (reportXmlStream.CanRead && reportXmlStream.Length > 0)
    {
        XmlDataParser parser = new XmlDataParser();
        using (XmlReader reader = XmlReader.Create(reportXmlStream))
        {
            XElement elem = XElement.Load(reader); //out of memory error here
            parsedXml = parser.doParse(elem);
        }
    }

读取从zip下载并加载到MemoryStream中的大型Xml文件

您不应该对400个XML文件使用DOM解析器(如XElement)。您应该使用SAX解析器。