用C#读/写大型XML文件

时间:2013-10-08 10:45:46

标签: c# .net xml database

我正在使用XML数据库开发一个应用程序。我有大型XML文件,我必须在其中读取和写入数据。 问题是我不想在内存中加载整个XML文件也不想因为性能问题而遍历整个文件。因为如果我将整个文件加载到内存中,这将影响应用程序性能,并可能因内存韭菜而导致应用程序崩溃。

我需要一种足够的方法来将XML写入和读取到文件中,这对性能和内存没有影响。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

如果此XML决定不属于您,您必须处理它(请参阅完整的MSDN示例http://msdn.microsoft.com/en-us/library/bb387013.aspx

static IEnumerable<XElement> StreamCustomerItem(string uri)
{
    using (XmlReader reader = XmlReader.Create(uri))
    {
        XElement name = null;
        XElement item = null;

        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        name = XElement.ReadFrom(reader) as XElement;
                        break;
                    }
                }

                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        item = XElement.ReadFrom(reader) as XElement;
                        if (item != null) 
                        {
                            XElement tempRoot = new XElement("Root", new XElement(name));
                            tempRoot.Add(item);
                            yield return item;
                        }
                    }
                }
            }
        }
    }
}

但是,如果您控制决定,那么,您应该忘记XML。有几个选项可以帮助您和您的应用程序正常工作,而不会有太多麻烦。

  1. SQL Compact。来自Microsoft的简单易用的SQL方法,并不需要SQL服务器实例。 http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx
  2. SQL Lite。适用于.net甚至Windows 8应用程序,简单而稳定。 http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
  3. 你甚至可以使用MySQL,MariaDB或类似的东西!

答案 1 :(得分:1)

看看这个,它会让你对快速阅读xml有所了解。 http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx

有一些关于在stackoverflow中编写xml文件的线程。

How to write (big) XML to a file in C#?

但是,我认为如果您正在寻找非常好的性能,一些数据库解决方案,例如sqlserver,mongodb可能是更好的选择

答案 2 :(得分:1)

使用此link

使用XmlReader,这是一个很好的选择,允许我们只将当前记录留在内存中,这可以极大地提高性能。

编辑:永远不要使用Load方法。它会将整个XML文件加载到内存中,如果此文件非常大,不仅查询可能需要很长时间才能执行,但可能会失败记忆。

答案 3 :(得分:0)

在某种程度上,性能完全取决于运行应用程序的.NET版本。另一个快速参考是Microsoft Patterns and Practices article

有4种方式:XMLDocument,XPathNavigator,XmlTextReader,Linq to XML,我认为它们之间的差异是有价值的!

XmlDocument

它表示XML文件的内容。从文件加载时,您将整个文件读入内存。一般来说,如果你使用的是XmlDocument,那么XML解析要慢得多,而XmlDocument更适合在RAM中加载整个DOM, ......你的应用程序的内存消耗可能就像毛毛虫移动一样!

使用DOM模型和XmlDocument或XPathDocument类来解析大型XML文档会对内存产生很大的需求。这些要求可能会严重限制服务器端Web应用程序的可伸缩性。

XPath或LINQ-To-XML

如果您对性能的关注更多,我个人不建议使用XPath或LINQ-To-XML查询。 XPathNavigator提供了一个用于导航和编辑XML数据的游标模型。

<强>的XmlReader

与XmlDocument相比,它可能有助于提高性能。正如其他人已经建议的那样XmlReader是一个抽象类,它提供了一个API,用于快速,仅向前,只读解析XML数据流......它可以从文件,Internet位置或任何其他数据流中读取。从文件中读取时,一次加载整个文档。这就是它的亮点。

<强> XmlTextReader的: XmlTextReader,是XmlReader的一个实现。使用XmlTextReader以前向只读方式快速处理XML数据,而无需使用验证,XPath和XSLT服务。

Eml规范化始终在XmlReader.Create的XmlReader中打开,这会影响XDocument。默认情况下,规范化在XmlTextReader上关闭,这会影响XmlDocument和XmlNodeReader。它可以通过Normalization属性打开。

设计注意事项

基准测试