如何处理大型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文件的想法吗*

如何处理大型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