代码之家  ›  专栏  ›  技术社区  ›  corlettk

如何用C语言将(大)XML写入文件?

  •  13
  • corlettk  · 技术社区  · 16 年前

    乡亲们,

    拜托,用C.NET 3.5编写大型XML文档(最高可达500MB)的好方法是什么?我四处搜索了一下,似乎找不到任何能解决这个特定问题的东西。

    我上一条线( 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。这是正确的吗?.我不能一次在内存中保存所有功能(最多50000个)。我需要从数据库中读取一个特性,将其序列化,并将其写入文件。所以我认为我应该使用XMLSerializer为文件中的每个特性编写一个“doclet”。我还不知道这是否可行。

    你怎么认为?

    背景: 我正在将一个旧的vb6 mapinfo“客户端插件”移植到C。有一个现有的J2EE“更新服务”(实际上只是一个Web应用程序),这个程序(以及其他程序)必须使用它。我无法更改服务器;除非是绝对必要的;尤其是涉及更改其他客户机的服务器。服务器接受带有不指定任何命名空间的架构的XML文档…IE:只有默认的名称空间,所有内容都在其中。

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

    干杯。基思。

    附言:现在是吃饭时间,所以我要擅离职守大约半个小时。

    4 回复  |  直到 16 年前
        1
  •  16
  •   Marc Gravell    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 };
            }
        }
    }
    
        2
  •  9
  •   David Schmitt    16 年前

    使用A XmlWriter :

    […]一位作家,提供了 非缓存、仅转发方式 生成包含 XML数据。

        3
  •  1
  •   shoosh    16 年前

    在将其写入磁盘之前,是否考虑压缩它?使用XML,您可以达到10倍以上的压缩甚至更多。与读取整个500MB版本相比,压缩文件和写入压缩版本可能需要更少的时间。

        4
  •  -1
  •   erikkallen    16 年前

    为什么不简单地使用文本编写器来编写XML呢?