繁体   English   中英

读取/写入C#中的大型XML文件

[英]Read/Write Large XML Files in C#

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

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

任何帮助将不胜感激。

如果这个XML决定不是您的决定,那么您就必须应对(请参阅整个MSDN示例http://msdn.microsoft.com/zh-cn/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 Server实例。 http://www.microsoft.com/zh-CN/sqlserver/editions/2012-editions/compact.aspx
  2. SQL Lite。 适用于.net甚至Windows 8应用程序,简单而稳定。 http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

您甚至可以使用MySQL,MariaDB或任何类似的东西!

看看这个,它将为您提供有关快速读取xml的一些想法。 http://msdn.microsoft.com/zh-CN/library/system.xml.xmltextreader.aspx

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

如何在C#中将(大)XML写入文件?

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

使用此链接

使用XmlReader ,它是允许我们仅将当前记录存储到内存中的一种不错的选择,它可以极大地提高性能。

编辑:切勿使用Load方法,它将整个XML文件加载到内存中,如果此文件很大,不仅查询可能需要很长时间才能执行,而且可能会耗尽内存。

性能在一定程度上取决于您的应用程序所运行的.NET版本。 另一个快速参考是Microsoft模式和实践文章

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

XmlDocument

它代表XML文件的内容。 从文件加载文件时,您会将整个文件读入内存。 一般来说,如果您使用的是XmlDocument,则XML解析会慢得多,而XmlDocument更适合于将整个DOM加载到RAM中……您的应用程序的内存消耗可能就像毛毛虫的移动方式一样!

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

XPath或LINQ-To-XML

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

XmlReader

与XmlDocument相比,它可能有助于获得更好的性能。 正如其他人已经建议的那样。 XmlReader是一个抽象类,并提供API用于XML数据流的快速,只读,只读解析……它可以从文件,互联网位置或任何其他数据流中读取。 从文件读取时,您不会一次加载整个文档。 这就是它的亮点。

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

EOL规范化始终在XmlReader.Create的XmlReader中启用,这会影响XDocument。 默认情况下,XmlTextReader上的规范化处于关闭状态,这会影响XmlDocument和XmlNodeReader。 可以通过Normalization属性将其打开。

设计注意事项

  • 考虑验证大型文档
  • 使用流接口
  • 考虑硬编码的转换
  • 考虑元素和属性名称的长度(!)
  • 考虑使用XmlNameTable: https ://msdn.microsoft.com/zh-cn/library/system.xml.xmlnametable%28v=vs.110%29.aspx

基准测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM