c# - 尝试将 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;
任何人都可以帮忙,在此先感谢。
解决方案
尝试使用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 的官方文档
推荐阅读
- picocli - 为什么 picocli 需要 ArgGroup 中的 args,即使默认多重性为 0..1?
- elisp - Elisp 定义阿克曼函数
- mysql - MySQL 8.0 Reference 说 MOD() + 1 从 1 + MOD() 返回不同的结果
- javascript - 无法从出现 cors 错误的 ajax api 调用中获得响应,在邮递员中工作正常。我在请求中添加了 cors 标头
- google-cloud-platform - 云 DNS 域配置
- javascript - Django/plotly.js:将 Pandas Dataframe 列传递给模板图表
- racket - 在 DrRacket 中将字符串列表转换为字符串
- c++ - 最大回文积(Project Euler)——C++
- c# - 如何在运行时将字符串作为代码插入?
- python - 将列表更改为具有随机值的字典