Как написать (большой) 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?