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