Doms开发日记

Doms系统开发过程中的点滴

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  22 Posts :: 0 Stories :: 222 Comments :: 7 Trackbacks
在使用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存储,就需要考虑这些数据是否会经常改动,如果需要经常改动的话,还是用数据库来存储效率要高点。
posted on 2007-12-16 15:59 kwanhong young 阅读(1577) 评论(3)  编辑 收藏

Feedback

#1楼  2007-12-16 17:21 Jeff Yang      
我倒是有时碰到Save后在XML文件的最前面多出一个“隐形”空格,那个“<”变形了,用前后箭头键并不能感觉到多了一个空格,但用Backspace可以删除一个“隐形”空格,并且删除后那个“<”恢复原形,Visual Studio也不不报错了。
  回复  引用  查看    

#2楼 [楼主] 2007-12-16 20:53 varptr      
那个应该是BOM,在文件头多出的3个字节,用于表示文档的编码方式(如utf8或utf16)
  回复  引用  查看    

#3楼  2007-12-18 09:09 XXOXX [未注册用户]
很有实际意义
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: