XmlDocument.WriteTo截断了结果文件。

9
尝试将XmlDocument序列化到文件中。XmlDocument相当大,但是在调试器中,我可以看到InnerXml属性中有所有的XML blob - 它在那里没有被截断。
以下是将我的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();

这里生成的文件只会输出到第5,760行,实际上它在标签中间被截断了!有没有人知道为什么会在这里截断?
更新:我找到了问题的源头。在关闭文件流之前,我没有关闭XML文本写入器!天啊!
4个回答

7
XmlTextWriter没有正确关闭。哎呀!

一个简单的规则:如果它是可丢弃的,那么某个地方必须处理它(在流和写入器上调用Dispose将刷新并关闭)。 - Pavel Minaev

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

嘿,保罗,感谢你的建议。我其实已经想到了(抱歉,在原始帖子中应该提到这一点),但我得到了相同的结果。同样地,我尝试切换编码,以为可能是某种问题,但没有成功。还有其他的想法吗? - Brad Heller

1

虽然原问题已经很久很久了,但它还是出现在了Google搜索结果中。

今天我也遇到了类似的问题,并想分享我的答案(为下一个不幸的灵魂解决这种困惑)。

我正在使用StreamWriter(sw)和MemoryStream(ms),将数据保存在内存中,然后在特定时间间隔刷新到文件流(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()

1
今天我遇到了这个问题,当时的代码如下:
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);
}

希望这对某人有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接