3

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

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

对于阅读,我同样想一次阅读一个元素(以与写入相同的顺序)。

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

4

3 回答 3

7

不深入细节,这并不容易回答。.NET 提供了不同的方法来处理 XML 文件:

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

根据您所说的,XmlReader/XmlWriter 组合似乎是最好的方法。

于 2013-05-16T06:19:06.350 回答
1

正如 Dirk 所说,使用 XmlWriter/XmlReader 组合听起来是最好的方法。它可能非常冗长,如果您的 XML 文件相当复杂,它会变得非常笨拙。我最近不得不在一些严格的内存限制下做类似的事情。我的 SO 问题可能会派上用场。

但就个人而言,我在 MSDN 博客上发现此方法非常容易实现,并且它巧妙地处理附加到 XML 文件的末尾而没有碎片。

于 2013-05-16T11:58:09.513 回答
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 查询您的对象列表。

于 2013-05-16T11:45:54.277 回答