XmlDocument.WriteTo усекает результирующий файл

Попытка сериализации XmlDocument в файл. XmlDocument довольно большой; однако в отладчике я вижу, что в свойстве InnerXml есть весь большой двоичный объект XML - он там не усекается.

Вот код, который записывает мой объект XmlDocument в файл:

// Write that string to a file.
var fileStream = new FileStream("AdditionalData.xml", FileMode.OpenOrCreate, FileAccess.Write);
xmlDocument.WriteTo(new XmlTextWriter(fileStream, Encoding.UTF8) {Formatting = Formatting.Indented});
fileStream.Close();

Файл, который здесь создается, записывается в строку, например, 5760 - он фактически обрезан в середине тега!

У кого-нибудь есть какие-то идеи, почему бы это усечь здесь?

Обновление: я нашел источник проблемы. Я не закрывал XML Text Writer до закрытия потока файлов! D'о!

4 ответа

Решение

XmlTextWriter не был закрыт должным образом. Woops!

Вы можете попытаться очистить поток перед закрытием. Если AutoFlush имеет значение true, я думаю, что он все равно сбрасывается на Close(), но это может стоить того:

// Write that string to a file. 
var fileStream = new FileStream("AdditionalData.xml", FileMode.OpenOrCreate, FileAccess.Write); 
xmlDocument.WriteTo(new XmlTextWriter(fileStream, Encoding.UTF8) {Formatting = Formatting.Indented}); 
fileStream.Flush();
fileStream.Close(); 

Я столкнулся с этой проблемой сегодня, когда код был, как показано ниже:

XmlTextWriter writer = new XmlTextWriter("IdP.xml", null);
writer.Formatting = Formatting.Indented;
xmlElement.WriteTo(writer);

Проблема была исправлена, когда я изменил ее, как показано ниже:

using (XmlTextWriter writer = new XmlTextWriter("IdP.xml", null))
{
    writer.Formatting = Formatting.Indented;
    xmlElement.WriteTo(writer);
}

Надеюсь, это кому-нибудь пригодится.

Это кстати... после того, как был задан оригинальный вопрос, но он появился в результатах поиска Google.

Сегодня я прошел через нечто подобное и хотел поделиться своим ответом (для следующей несчастной души, которая столкнулась с этой путаницей).

Я использую StreamWriter (sw) с MemoryStream (мс), чтобы сохранить данные в памяти, а затем через определенные промежутки времени выводить их в файловый поток (fs).

Так я и делал

    sw.WriteLine(DateTime.Now.ToString("u").Replace("Z", "") & ":  " & entry)

А потом ведь было сказано и сделано

    ms.WriteTo(fs)
    fs.Flush()
    fs.Close()
    ms.Close()

Проблема была в том, что я сначала не сбрасывал StreamWriter в MemoryStream

Изменение этого решило мою проблему.

    sw.Flush()
    ms.WriteTo(fs)
    fs.Flush()
    fs.Close()
    ms.Close()
Другие вопросы по тегам