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

时间:2009-05-16 09:08:47

标签: c# xml

民间,

请问,在C#.NET 3.5中编写非常大的XML文档(最多500 MB)有什么好方法?我已经进行了一些搜索,似乎无法找到解决这个特定问题的任何内容。

我之前的帖子(What is the best way to parse (big) XML in C# Code?)涵盖了读取类似量级的Xml文档......解决了这个问题后,我需要考虑如何将更新的功能(http://www.opengeospatial.org/standards/sfa)写入“update.xml”文档。

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

您怎么看?

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

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

干杯。基思。

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

4 个答案:

答案 0 :(得分:16)

对于写大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<Foo> FooGenerator() {
        for (int i = 0; i < 40; i++) {
            yield return new Foo { Id = i, Bar = "Foo " + i };
        }
    }
}

答案 1 :(得分:9)

使用XmlWriter

  

[...]提供快速的作家,   非缓存,仅向前的手段   生成包含的流或文件   XML数据。

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

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