XmlDocument.WriteTo усекает результирующий файл - PullRequest
8 голосов
/ 09 июня 2010

Попытка сериализации 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 ]

7 голосов
/ 06 июля 2010

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

4 голосов
/ 09 июня 2010

Вы можете попытаться очистить поток перед закрытием.Если 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(); 
1 голос
/ 04 августа 2014

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

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);
}

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

1 голос
/ 22 марта 2012

Это очень кстати ... после того, как был задан оригинальный вопрос, но он появился в результатах поиска 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()
...