如何处理大型xml文件
本文关键字:大型 xml 文件 处理 何处理 | 更新日期: 2023-09-27 17:58:33
public XmlNodeList GetNodes(string _logFilePath, string _strXPathQuery)
{
objXmlDoc = new XmlDocument();
objXmlDoc.Load(_logFilePath);
XmlNodeList objxmlNodeList = objXmlDoc.SelectNodes(_strXPathQuery);
return objxmlNodeList;
}
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<AppXmlLogWritter>
<LogData>
<LogID>999992013021110381000001</LogID>
<LogDateTime>20130211103810</LogDateTime>
<LogType>Message</LogType>
<LogFlag>Flag</LogFlag>
<LogApplication>Application</LogApplication>
<LogModule>Module</LogModule>
<LogLocation>Location</LogLocation>
<LogText>Text</LogText>
<LogStackTrace>Stacktrace</LogStackTrace>
</LogData>
</AppXmlLogWritter>
这里,当我将Xml文件加载到xmlDocument对象中时,它的大小是1000MB,然后给我一个内存不足的异常。因为xmlDocument将节点存储到内存中。我使用Xpath查询通过Xml文件过滤节点。然后绑定到listview以显示节点。我读过一些关于如何处理大型XML文件的文章,他们告诉我使用XpathQuery。但问题并没有解决。文件流怎么样?或者有其他加载大型xml文件的想法吗*
您可以编写一个方法,该方法将使用XmlReader
来读取大块的XML文件。
首先设计一个保存数据的模型:
public class LogData
{
public string LogID { get; set; }
public string LogDateTime { get; set; }
public string LogType { get; set; }
...
}
然后是一种解析XML文件的方法:
public static IEnumerable<LogData> GetLogData(XmlReader reader)
{
LogData logData = null;
while (reader.Read())
{
if (reader.IsStartElement("LogData"))
{
logData = new LogData();
}
if (reader.Name == "LogData" && reader.NodeType == XmlNodeType.EndElement)
{
yield return logData;
}
if (reader.Name == "LogID")
{
logData.LogID = reader.ReadElementContentAsString();
}
else if (reader.Name == "LogDateTime")
{
logData.LogDateTime = reader.ReadElementContentAsString();
}
else if (reader.Name == "LogType")
{
logData.LogType = reader.ReadElementContentAsString();
}
...
}
}
现在,您可以只加载要显示的元素。例如:
using (var reader = XmlReader.Create("someHugeFile.xml"))
{
IEnumerable<LogData> data = GetLogData(reader).Skip(10).Take(5);
// Go ahead and bind the data to your UI
}
您可能想知道的另一件事是,为了有效地实现分页,XML文件中总共有多少条记录。这可以用另一种方法来完成:
public static int GetTotalLogEntries(XmlReader reader)
{
var count = 0;
while (reader.Read())
{
if (reader.IsStartElement("LogData"))
{
count++;
}
}
return count;
}
我建议您在将xml消息发送到流之前压缩它们,然后在另一端接收到它后对其进行解压缩。在WCF中,您可以这样做http://www.codeproject.com/Articles/165844/WCF-Client-Server-Application-with-Custom-Authenti#Compression