首页 > 解决方案 > 尝试将 xml 导入到 android 时出现 OutOfMemoryException

问题描述

当我尝试使用我们制作的应用程序将文件导入我的 android 时,我有 230 mb 大、长度为 2.3 亿的 xml 文件,但是当尝试readtoend将字符串导入变量时,我得到一个错误:

System.outofmemoryexception :在 system.text.stringbuilder.tostring() 处(包装器托管到本机)system.string.fastallocatestring(int) 处内存不足

这是以下代码

var documentsPath = Android.OS.Environment.ExternalStorageDirectory.ToString();
            var dirName = System.IO.Path.Combine(documentsPath.ToString(), "Stock");

            var filePath = System.IO.Path.Combine(dirName, "Data.xml");
            TextReader tr = new StreamReader(filePath);
            string result = tr.ReadToEnd();
            tr.Close();

            var st = new XStreamingElement(filePath);

            return result;

任何人都可以帮忙,在此先感谢。

标签: c#androidxmlxamarin

解决方案


尝试使用XMLTextReader 类,如下例所示:

XmlTextReader myTextReader = new XmlTextReader(filename);
myTextReader.WhitespaceHandling = WhitespaceHandling.None;
while (myTextReader.Read())
{
    if (myTextReader.NodeType == XmlNodeType.Element &&
        myTextReader.LocalName == "Reward" &&
        myTextReader.IsStartElement() == true)
        {
            ProcessRewardNode(myTextReader);
                myTextReader.Skip();
    }
}

这是ProcessRewardNode的方法实现:

private void ProcessRewardNode(XmlTextReader RewardReader)
{
    XmlDocument RewardXmlDoc = new XmlDocument();
    RewardXmlDoc.LoadXml(RewardReader.ReadOuterXml());
    // we can use xpath as below
    myID = RewardXmlDoc.SelectSingleNode("Reward/myID").InnerText;
}

更多信息请访问XMLTextReader 的官方文档


推荐阅读