C# XmlDocument未完全保存文件

C# XmlDocument未完全保存文件,c#,xml,xamarin,xamarin.android,xmldocument,C#,Xml,Xamarin,Xamarin.android,Xmldocument,我有一个简单的代码,它修改了现有的XML文件,如下所示: roomsfile = new File(Path.Combine(rootDir, "rooms.dat")); XmlDocument roomdata = new XmlDocument(); roomdata.Load(roomsfile.AbsolutePath); XmlElement root = roomdata.DocumentElement; XmlNode roomNode = roomdata.Create

我有一个简单的代码,它修改了现有的XML文件,如下所示:

roomsfile = new File(Path.Combine(rootDir, "rooms.dat"));    
XmlDocument roomdata = new XmlDocument();
roomdata.Load(roomsfile.AbsolutePath);
XmlElement root = roomdata.DocumentElement;
XmlNode roomNode = roomdata.CreateElement("room");
XmlNode noNode = roomdata.CreateElement("no");
XmlNode nameNode = roomdata.CreateElement("name");

//roomNo and roomName are text fields
noNode.InnerText = roomNo.Text; 
nameNode.InnerText = roomName.Text;

roomNode.AppendChild(noNode);
roomNode.AppendChild(nameNode);
root.AppendChild(roomNode);

roomdata.Save(roomsdat.AbsolutePath);
我的原始XML文件是:

<?xml version="1.0" encoding="utf-8"?>
<rooms>
  <room>
    <no>101</no>
    <name>Reception</name>
  </room>
  <room>
    <no>102</no>
    <name>Manager Room</name>
  </room>
</rooms>

101
接待
102
经理室
当我运行代码时,它会将文件转换为:

<?xml version="1.0" encoding="utf-8"?>
<rooms>
  <room>
    <no>101</no>
    <name>Reception</name>
  </room>
  <room>
    <no>102</no>
    <name>Manager Room</name>
  </room>
  <room> 
    <

101
接待
102
经理室
<
所以它显然是不完整的。然后当我尝试使用该文件时,它破坏了我的应用程序。什么会导致这种行为


作为记录,此应用程序正在Visual Studio 2013中的Xamarin(MonoDroid)上编写。

好的,所以我发现这只是我的XML文件在应用程序仍在使用时的显示方式。即使我把文件复制到我的电脑上,并用记事本++查看它,它似乎还是坏了。但应用程序使用它就像预期的一样,没有任何问题(显然是另一个问题打破了它)。一种奇怪的行为,如果你问我的话。但我不会再挖下去了

无论如何,在评论中,dbc指出了一个关于覆盖文件的简单但很酷的技巧,我认为这对于防止任何应用程序中潜在的文件损坏问题是至关重要的。在我以后的编码生涯中,我将以此作为经验法则:

写入一个新文件,然后删除旧文件并重命名新文件,实际上是一种好的做法。这样,如果在写入文件时发生任何事情(例如,磁盘已满,或者用户终止了您的进程),则原始文件将保持不变


你能用一个简短但完整的控制台应用程序,仅仅使用普通的.NET来重现这一点吗?(我强烈建议使用LINQ to XML而不是XmlDocument,但这只是因为它是一个清晰的API-您的代码应该可以工作…)我没有发现代码有错,XML是相同的,除了“您使用哪个文件类来创建
新文件()
?看起来很奇怪。@JonSkeet我真的没有多少时间。此外,我不擅长LINQ,总是使用代码片段,从不从头开始编写LINQ代码。将LINQ学习为XML(和LINQ-它们是不同的东西)将为您节省大量时间。下一步:您如何查看不完整的文件?是否有其他东西可能仍然打开了该文件?