/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

.NET 解决XML反序列化出现 XML文档(0, 0)中有错误 缺少根元素。

2014-03-09 十有三 0 浏览:2万+ .NET技术 C#

项目中在进行XML反序列化时,出现 "XML文档(0,0)中有错误 缺少根元素"的错误信息。

出现这种错误首先验证XML文档的格式是否有问题,如果XML文档的格式是正确的话,那么下面才来排除是否是程序的问题。 

下面是原程序中对文档进行反序列化的代码 :

string strBody = string.Empty;
object obj = null;
using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(stream))
    {
        sw.Write(Encoding.UTF8.GetBytes(strBody));
        sw.Flush();
        try
        {
            //此处反序列化的时候会报错
            obj = serializer.Deserialize(stream);
        }
        catch (Exception ex)
        {
            obj = default(T);
        }
    }
}

在执行到obj = serializer.Deserialize(stream);这句代码的时候出错,提示"XML文档(0, 0)中有错误 缺少根元素"。本来这个错误应该是因为XML文档格式错误导致的,但在XML文档格式没有错误的情况下,那就是这句代码出了问题。

由于在进行XML反序列化之前,有对流进行过写入操作(执行了sw.Write(Encoding.UTF8.GetBytes(strBody))这句代码),这样就会造成当前流所在起始位置发生改变,流的位置就会处于最后读取的位置。上面代码是将整个XML文档读取完,所以最终流的位置是XML文档的尾部。而序列化是从流最后的位置开始读取,所以读取到是空白的XML文档,空白的XML文档自然会提示缺少根元素了。

解决方法是只要我们在反序列化XML文档之前,先将流的位置设置成起始位置,即0坐标,就可以正确反序列化出XML文档, 可以使用Seek方法或者Position属性进行设置。

具体代码如下 :

string strBody = string.Empty;
object obj = null;
using (MemoryStream stream = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(stream))
    {
        sw.Write(Encoding.UTF8.GetBytes(strBody));
        sw.Flush();
        //有两种设置方法,一种是设置Position属性,一种是调用Seek方法                    
        //设置Position属性代码: stream.Position=0;
        stream.Seek(0, SeekOrigin.Begin);
        try
        {
            obj = serializer.Deserialize(stream); 
        }
        catch (Exception ex)
        {
            obj=default(T); 
        }
    }
}

 


作者:十有三

出处:https://shiyousan.com/post/635299994149827052

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: 解决vs2010添加项目后解决方案资源管理器中没有显示解决方案的问题
  • 下一篇: 骑马与砍杀 战团 NPC完全攻略 全NPC详细能力资料整理+潜力分析+NPC互相搭配最佳组合

相关文章
  • Visual Studio Community 2013 微软官方Q&A 英汉翻译对照
  • C#解决IIS域名批量绑定
  • ASP.NET MVC 获取及手动更新AntiForgeryToken防伪标记
  • 总结Visual Studio Community 2013的特点与其他VS版本的区别
  • ASP.NET MVC 动态返回指定的HTTP状态码
  • LINQ TO SQL调用dbml文件无法打开,提示未能检索当前项目.dbml 中存在验证错误而失败

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • SQL Service 2008 SQL语句 四舍五入保留两位小数
  • ChinaPay踩坑笔记一:在64位系统中不支持ASP支付功能
  • OneNote使用技巧分享:如何在办公室等公共场合中安全使用私人笔记
  • 解决SQL SERVER 2014 不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的表进行了更改或者启用了"阻止保存要求重新创建表的更改"选项
  • ASP.NET CheckBoxList控件动态修改ListItem选项的字体颜色和背景颜色

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号