使用XmlDocument的Save方法容易出错的问题

来源: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存储,就需要考虑这些数据是否会经常改动,如果需要经常改动的话,还是用数据库来存储效率要高点。
 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭