来源:uuBox.net 开发日记 http://www.cnblogs.com/uubox/archive/2007/12/16/996694.html
在使用XmlDocument的Save方法将内容保存到一个XML文件时,有时会发现保存后得到的XML文档会解析不了,并显示“XML只能存在一个根节点”的错误,用记事本打开XML文档看会发现XML文档的末尾会多出几行多余的文本。特别是对XmlDocument进行了移除子节点的操作之后,这个现象经常会遇到。如下面的一段代码:
private XmlDocument loadXml()
{
FileStream stream = new FileStream( " friend.xml " ,
FileMode.Open, FileAccess.Read);
XmlDocument doc = new XmlDocument();
doc.Load(stream);
stream.Close();
return doc;
}
private void saveXml(XmlDocument doc)
{
FileStream stream = new FileStream( " friend.xml " ,
FileMode.OpenOrCreate, FileAccess.Write);
doc.Save(stream);
stream.Close();
}
先用loadXml加载XML文档,然后进行查询、插入、删除子节点等操作,最后调用saveXml方法保存,上述的问题就会出现。
那么为什么会出现这样的问题呢?通过查看保存后的XML文档会发现,多余的内容正是原先XML文档的末尾部分的内容,说明在写入文件时没有把原来XML文件整个重写,而只是覆盖上去而已。至此就找到原因了,在saveXml方法里的new FileStream语句打开文件的方式是OpenOrCreate,当写入文件时,如果原文件存在,FileStream是用FileMode.Open方式打开流的,所以doc.Save语句仅仅是覆盖了部分内容而已。解决问题的方法就是将 OpenOrCreate改为Create,让保存时将整个XML替换掉。
总结一下,当我们越来越多地使用数据库和XML文件储存数据时,有时会忘记了XML文件其实是文本文件,内容修改之后如果要保存xml文件,其实都只能整个XML覆盖一遍的,尽管有时只是修改整个xml文档其中的小小一部分。所以如果你的程序有大量的数据需要用xml存储,就需要考虑这些数据是否会经常改动,如果需要经常改动的话,还是用数据库来存储效率要高点。