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

伙计们,

请问,在C#.NET 3.5中编写非常大的XML文档(最多500 MB)有什么好方法? 我有一些搜索,似乎找不到任何解决这个具体问题的东西。

我以前的post( 在C#Code中解析(大)XML的最佳方法是什么? )包括阅读类似大小的Xml文档……解决了这个问题后,我需要考虑如何编写更新的function( http:// www。 opengeospatial.org/standards/sfa )到“update.xml”文件。

我的想法:考虑到要生成的文档的最大大小,显然有一个大的DOM已经出局了。 我正在使用XSD.EXE从模式中生成绑定类…它与XmlSerializer类很好地配合,但我认为它在“引擎盖下”构建了一个DOM。 它是否正确?。 我不能同时在内存中保存所有function(最多50,000个)。 我需要从数据库中读取一个function,序列化它,并将其写入文件。 所以我想我应该使用XmlSerializer为文件的每个单独的function写一个“doclet”。 如果这是可能/可行的话,我还不知道。

你怎么看?

背景:我正在将旧的VB6 MapInfo“客户端插件”移植到C#。 有一个现有的J2EE“更新服务”(实际上只是一个web-app),该程序(以及其他)必须使用它。 我无法改变服务器; 除非有必要; 特别是涉及改变其他客户。 服务器接受一个XML文档,其架构不具体说明任何名称空间……即:只有默认名称空间,一切都在其中。

我的经验:我几乎是一个C#和.NET新手。 我用各种语言编写了大约10年的编程,包括Java,VB,C和一些C ++。

干杯全都。 基思。

PS:这是晚餐时间,所以我大约半小时都会擅离职守。

对于编写大型xml, XmlWriter (直接)是你的朋友 – 但它更难使用。 另一种选择是使用DOM /对象模型方法并将它们组合起来, 如果你掌握了XmlWriterSettings控制并禁用了xml标记,并且摆脱了名称空间声明,这可能是可行的……

 using System; using System.Collections.Generic; using System.Xml; using System.Xml.Serialization; public class Foo { [XmlAttribute] public int Id { get; set; } public string Bar { get; set; } } static class Program { [STAThread] static void Main() { using (XmlWriter xw = XmlWriter.Create("out.xml")) { xw.WriteStartElement("xml"); XmlSerializer ser = new XmlSerializer(typeof(Foo)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("",""); foreach (Foo foo in FooGenerator()) { ser.Serialize(xw, foo, ns); } xw.WriteEndElement(); } } // streaming approach; only have the smallest amount of program // data in memory at once - in this case, only a single `Foo` is // ever in use at a time static IEnumerable FooGenerator() { for (int i = 0; i < 40; i++) { yield return new Foo { Id = i, Bar = "Foo " + i }; } } } 

使用XmlWriter :

[…]一个编写器,它提供快速,非缓存,仅向前的方法来生成包含XML数据的流或文件。

您是否考虑在将其写入磁盘之前对其进行压缩? 使用XML,您可以达到10倍以上的压缩甚至更多。 压缩文件和编写压缩版本可能比读取整个500Mb版本花费的时间更少。

为什么不简单地使用TextWriter来编写XML?