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

3

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

对于写入,我想逐个生成元素,然后将其附加到文件中。

对于阅读,我同样希望按照编写顺序逐个读取元素。

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


如果你曾经想过将XML处理为字符串,请停止。这不仅是针对.NET的建议,也适用于任何平台。现在值得信赖的任何平台都会倾向于至少支持两个XML API——一个用于DOM操作,另一个用于流式传输。使用它们,可以避免自己(以及希望与您进行互操作的任何人)遭受痛苦的世界。 - Damien_The_Unbeliever
那是一种有些天真的看法。XML通常被序列化为字符串,这就是"处理"。某些情况下会出现这种情况,比如在较慢的设备上生成大型(简单)XML文件(这是我所提到的情况)。有经验的开发人员不会在这种情况下遭受"痛苦的世界"来处理XML。 - Herman Schoenfeld
正如我所说,有两个通用的API(DOM和流)可以满足大多数需求。而且我不同意-从字符串序列化和反序列化只是序列化-而不是处理。你可能没有遇到过我见过的那种手动编写的XML处理代码-处理将<elem></elem><elem/>视为不同的内容,只能在预期前缀的情况下处理命名空间代码等。 - Damien_The_Unbeliever
换句话说,如果你处于资源受限的环境中,无法使用XML API,请不要假装生成XML,而是生成一些更简单的东西,比如CSV。不要做出你无法实现的承诺。 - Damien_The_Unbeliever
如果生活能够如此简单就好了。我从来没有成功地向客户解释由于硬件“限制”而无法提供某些功能的情况而得到报酬。现实是必须让它工作,如果设备需要生成(大量)XML与外部系统进行交互,则将字符串附加(或批量附加)到文件中可能是适当的。 - Herman Schoenfeld
3个回答

7

不具体说明的话,这个问题很难回答。.NET提供了不同的方法来处理XML文件:

  • XmlDocument创建一个DOM,支持XPath查询,但会将整个XML文件加载到内存中。
  • XElement/XDocument支持LINQ,也会将整个XML文件读入内存。
  • XmlReader是一个只向前读取的阅读器。它不会将整个文件读入内存。
  • XmlWriter与XmlReader类似,用于编写XML文件。

根据你的说法,XmlReader/XmlWriter组合似乎是最佳选择。


1

正如Dirk所说,使用XmlWriter/XmlReader组合似乎是最佳方法。如果您的XML文件相当复杂,它可能会非常冗长而且难以处理。最近我也不得不在一些严格的内存限制下做类似的事情。我的SO问题可能会有帮助。

但就我个人而言,我发现这种方法在MSDN博客上非常容易实现,而且它可以很好地处理在不产生片段的情况下追加到XML文件的末尾。


0
尝试从*.xml文件中制作一个*.xsd文件。然后可以从*.xsd文件生成*.cs文件。之后将*.xml文件加载到对象中。这应该比整个文件占用更少的内存。
VS2010有一个插件叫做XSD2Code,可以从*.xsd文件生成*.cs文件。在该插件中,您可以选择为序列化装饰属性。对于名为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 查询你的对象列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接