Как написать (большой) XML в файл на С#?

Люди,

Пожалуйста, какой хороший способ писать действительно большие XML-документы (до 500 МБ) в С#.NET 3.5? У меня было немного поиска, и я не могу найти ничего, что бы рассматривало этот конкретный вопрос.

Мой предыдущий поток (Каков наилучший способ синтаксического анализа (большого) XML в коде С#?) охватил чтение подобных XML-документов масштаба... С учетом этого я решил нужно подумать о том, как записать обновленные функции (http://www.opengeospatial.org/standards/sfa) в документ "update.xml".

Мои идеи: Очевидно, что один большой DOM отсутствует, учитывая максимальный размер документа, который будет выпущен. Я использую XSD.EXE для создания классов привязки из схемы... которая отлично работает с классом XmlSerializer, но я думаю, что он создает DOM "под капотом". Это верно?. Я не могу использовать все функции (до 50 000 из них) в памяти за один раз. Мне нужно прочитать функциональную форму базы данных, сериализовать ее и записать в файл. Поэтому я думаю, что я должен использовать XmlSerializer для записи "doclet" для каждой отдельной функции в файл. Я понятия не имею (пока), если это возможно и возможно.

Как вы думаете?

Фон: Я переношу старый клиентский плагин VB6 MapInfo на С#. Существует существующая J2EE-служба обновления (фактически это просто веб-приложение), с которой должна работать эта программа (среди прочего). Я не могу изменить сервер; если не требуется абсазативно; особенно это связано с изменением других клиентов. Сервер принимает XML-документ со схемой, которая не специфична для каких-либо пространств имен... т.е. Существует только пространство имен по умолчанию, и все в нем.

Мой опыт: Я в значительной степени новичок С# и .NET. Я программировал около 10 лет на разных языках, включая Java, VB, C и некоторые С++.

Приветствует всех. Кит.

PS: Время ужина, поэтому я буду AWOL около получаса.

Ответы

Ответ 1

Для записи большого xml XmlWriter (напрямую) является вашим другом, но его труднее использовать. Другой вариант - использовать подходы DOM/object-model и объединить их, что, вероятно, возможно, если вы захватите управление 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

Используйте XmlWriter:

[...] писатель, который обеспечивает быструю, не кэшированные, прямое средство генерирование потоков или файлов, содержащих XML-данные.

Ответ 3

Считаете ли вы его сжатие перед записью на диск? С XML вы можете достичь более 10-кратного сжатия и даже больше. вам, вероятно, потребуется меньше времени, чтобы сжать файл и записать сжатую версию, чем прочитать всю версию 500 Мб.

Ответ 4

Почему бы просто не использовать TextWriter для записи XML?