Как написать (большой) XML в файл в C #? - PullRequest
13 голосов
/ 16 мая 2009

Люди,

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

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

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

Что вы думаете?

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

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

Ура всем. Кит.

PS: сейчас время обеда, так что я буду просиживаться около получаса.

Ответы [ 4 ]

16 голосов
/ 16 мая 2009

Для написания больших 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 };
        }
    }
}
9 голосов
/ 16 мая 2009

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

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

1 голос
/ 16 мая 2009

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

0 голосов
/ 16 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...