用C#读/写大型XML文件

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

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

任何帮助将不胜感激。

如果这个XML决定不是你的,你必须处理它(参见完整的MSDN示例http://msdn.microsoft.com/en-us/library/bb387013.aspx )

static IEnumerable 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

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

看看这个,它会给你一些快速阅读xml的想法。 http://msdn.microsoft.com/en-us/library/system.xml.xmltextreader.aspx

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

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

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

使用此链接 。

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

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

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

有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数据,而无需使用validation,XPath和XSLT服务。

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

设计注意事项

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

基准测试