【发布时间】:2018-08-08 05:19:10
【问题描述】:
我正在尝试解析大型 XML 文件(大小接近 600MB)并使用
这需要更长的时间,最后,整个过程中止。该过程以异常结束。
消息:“线程已中止”
方法:
private string ReadXml(XmlTextReader reader, string fileName)
{
string finalXML = "";
string s1 = "";
try
{
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
s1 += "<" + reader.Name + ">";
break;
case XmlNodeType.Text: //Display the text in each element.
s1 += reader.Value;
break;
case XmlNodeType.EndElement: //Display the end of the element.
s1 += "</" + reader.Name + ">";
break;
}
finalXML = s1;
}
}
catch (Exception ex)
{
Logger.Logger.LogMessage(ex, "File Processing error: " + fileName);
}
reader.Close();
reader.Dispose();
return finalXML;
}
然后读取和脱盐:
string finalXML = string.Empty;
XmlTextReader reader = new XmlTextReader(unzipfile);
finalXML = await ReadXml(reader, fileName);
var xmlremovenamespae = Helper.RemoveAllNamespaces(finalXML);
XmlParseObjectNew.BizData myxml = new XmlParseObjectNew.BizData();
using (StringReader sr = new StringReader(xmlremovenamespae))
{
XmlSerializer serializer = new XmlSerializer(typeof(XmlParseObjectNew.BizData));
myxml = (XmlParseObjectNew.BizData)serializer.Deserialize(sr);
}
有没有更好的方法来读取和解析大型 xml 文件?需要一个建议。
【问题讨论】:
-
你到底想在这里实现什么?你期望最终的字符串有多大? (提示:如果它很大,这可能不是一个好主意。使用这样的字符串连接当然不是一个好主意。)
-
Jon 打败了我,但是,是的,你想在这里做什么?如果您有使用字符串连接,最好使用
StringBuilder。但是,根据您要实现的目标,可能会有更有效的方法,例如,使用XmlDocument -
感谢@DiskJunky 之前尝试使用 StringBuilder 但出现“内存不足”异常。
-
@Anadi 很公平,但是你能描述一个小的 XML sn-p 输入和你想要的输出吗?
-
@DiskJunky 但是
XmlDocument等DOM方法会很快占用大量内存。对于较大的文件,我建议使用XmlReader。