使用.NET 3.5处理大型XML文件

时间:2013-05-16 06:05:33

标签: c# .net xml

在.NET 3.5中处理非常大的XML文件的“推荐”方法是什么?

对于写作,我想一次生成一个元素,然后追加到文件中。

为了阅读,我同样想要一次读取一个元素(按照与写入的顺序相同)。

我有一些想法如何使用字符串和File.Append,但.NET 3.5提供XML Api来处理任意大的XML文件?

3 个答案:

答案 0 :(得分:7)

没有详细说明,这不容易回答。 .NET提供了不同的方法来处理XML文件:

  • XmlDocument创建一个DOM,支持XPath查询,但将整个XML文件加载到内存中。
  • XElement / XDocument支持LINQ,并将整个XML文件读入内存。
  • XmlReader是一名前瞻性读者。它不会将整个文件读入内存。
  • XmlWriter就像XmlReader一样,除了写

基于你所说的XmlReader / XmlWriter组合似乎是最好的方法。

答案 1 :(得分:1)

正如Dirk所说,使用XmlWriter / XmlReader组合听起来是最好的方法。它可能非常冗长,如果您的XML文件相当复杂,则会变得非常笨拙。最近我必须做一些类似的东西,有一些严格的内存限制。 My SO question might come in handy.

但就个人而言,我发现这个方法here on MSDN blogs非常容易实现,它可以整齐地处理附加到XML文件末尾而没有片段。

答案 2 :(得分:0)

尝试从* .xml中创建* .xsd文件。您可以从* .xsd文件生成* .cs文件。之后,将* .xml文件加载到您的对象。它应该比整个文件占用更少的内存。

VS2010有一个插件,提供从* .xsd生成* .cs文件的选项。它被称为XSD2Code。在该插件中,您可以选择装饰属性以进行序列化。对于名为Settings的* .xsd文件,您将获得Settings.cs。你不会做这样的事情。

StreamReader str = new StreamReader("SomeFolder\\YourFile.xml");
XmlSerializer xmlSer = new XmlSerializer(typeof(TcpPostavke));
Settings m_settings = (Settings )xmlSer .Deserialize(str);

您可以使用Linq查询对象列表。