关于Data at the root level is invalid错误的解决方式

2023-11-03


有时在使用XmlDocument.LoadXML()方法时会出现报Data at the root level is invalid的错误。


网上很多说发是因为xml文件的格式不对引起,如果你在仔细的查看了xml文件格式后并没有发现问题,那么很可能是UTF8编码格式中的BOM头引起的。

这里找的的答案:http://www.codeproject.com/Questions/572872/Dataplusatplustheplusrootpluslevelplusisplusinvali


什么是BOM?

BOM: Byte Order Mark

UTF-8 BOM又叫UTF-8 签名,其实UTF-8 的BOM对UFT-8没有作用,是为了支持UTF-16,UTF-32才加上的

BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。

Byte Order Marks are special characters at the beginning of a Unicode file to indicate whether it is big or little endian, in other words does the high or low order byte come first. These codes also tell whether the encoding is 8, 16 or 32 bit. You can recognise Unicode files by their starting byte order marks, and by the way Unicode-16 files are half zeroes and Unicode-32 files are three-quarters zeros. Unicode Endian Markers

Byte-order mark Description

EF BB BF UTF-8

FF FE UTF-16 aka UCS-2, little endian

FE FF UTF-16 aka UCS-2, big endian

00 00 FF FE UTF-32 aka UCS-4, little endian.

00 00 FE FF UTF-32 aka UCS-4, big-endian.

UTF的字节序和BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”?

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

原来BOM是在文件的开始加了几个字节作为标记。有了这个标记,一些协议和系统才能识别。

 

源文档 <http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html>



上面的只是说下什么bom,下面针对BOM引起的这个报错一般可以用以下两个方式解决


1.修改xml文件的编码格式


用notepad++的编辑器打开xml文件后将其编码格式换成 无BOM的UTF8保存


2.在代码中强识别去除BOM头


//这里用来去除UTF-8中的bom
                    byte[] bomBuffer = new byte[] { 0xef, 0xbb, 0xbf };
                    if (cache[0] == bomBuffer[0]
                        && cache[1] == bomBuffer[1]
                        && cache[2] == bomBuffer[2])
                    {

                        xmlStr = System.Text.Encoding.UTF8.GetString(cache, 3, cache.Length - 3);

                    }
                    else 
                    {
                        xmlStr = System.Text.Encoding.UTF8.GetString(cache);
                    }
                    doc.LoadXml(xmlStr);



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Data at the root level is invalid错误的解决方式 的相关文章

随机推荐

  • 【用JS自制表格软件玩数据】8. 设计单元格中的右键菜单

    右键菜单选项的设计 效果图 基本数据 分析 功能 菜单的渲染模块 右键菜单的样式 最终结果 当写完本系列后 我会把源代码分享出来给大家 本课程也会持续更新与矫正 欢迎留言指正 效果图 基本数据 首先构建一个基本的配置数据 property
  • 【历史上的今天】1 月 9 日:iPhone 问世;iTunes 发布;激光打印机的发明者出生

    整理 王启隆 透过 历史上的今天 从过去看未来 从现在亦可以改变未来 今天是 2023 年 1 月 9 日 在 1978 年的这段时间 我国恢复了研究生制度 这一年 共录取了 10500 多名研究生 研究生教育的中断和复兴是一个漫长的过程
  • Linux中利用docker搭建深度学习环境

    写在前面 在深度学习中 避免不了在远程服务器上进行模型的训练 如果直接在服务器裸机的基础环境跑显然是不可取的 此时搭建用于模型训练的docker环境显得尤为重要 1 下载基础镜像 选择一个合适的基础镜像会给后续的操作带来极大的便利 其中uf
  • centos7安装redis

    文章目录 一 准备工作 二 安装redis 三 配置redis 四 配置redis服务 五 其他 一 准备工作 关闭防火墙等 linux时间校对 试验环境 虚拟机服务器版本 centos7 虚拟机IP地址 192 168 1 10 win端
  • uniapp在H5获取当前定位信息不需要SDK可直接获取城市(包括经纬度省市区和市区编码)

    前言 最近在做获取用户当前定位信息的时候 发现uniapp官方提供的uni getLocation OBJECT 兼容性并不是特别好 光注意事项都是密密麻麻一大堆 在实际使用场景下 效果并不理想 也不是很稳定 于是便重新封装了一下腾讯地图的
  • JUC-多线程(5.获得线程的第三种方式)学习笔记

    文章目录 获得线程的第三种方式 Callable接口 1 前言 1 获得多线程的方法几种 2 以下两种获得线程的方式的异同 2 使用 1 重写 call 方法 2 创建线程 3 获取返回值 3 原理 1 简述 2 解释 3 结论 获得线程的
  • 关于加速度计读数与加速度方向的问题

    近几日对加速计读数的正负与其敏感轴 实际加速度计方向的关系又产生了诸多疑问 参考这篇博文的一个模型后 更是混乱了 http www geek workshop com forum php mod viewthread tid 1695 re
  • Kotlin Primer·第三章·Kotlin 与 Java 混编

    虽然 Kotlin 的开发很方便 但当你与他人协作时 总会碰到 Java 与 Kotlin 代码共存的代码项目 本章就教你如何优雅的实现 Kotlin 与 Java 混合编程 3 1 直接转换 3 1 1 将 Java 转换为 Kotlin
  • 数据库设计技巧

    如今 随着软件应用领域的扩大 我们要处理的数据也越来越多 面对各式各样的数据 我怎么样系统的保存和管理这些数据呢 这里我们就要采用关系型数据库 关系型数据库是当前最广泛的应用的数据库类型 如mysql oracle access 等等 很多
  • 力扣:455. 分发饼干--方法二使用while

    假设你是一位很棒的家长 想要给你的孩子们一些小饼干 但是 每个孩子最多只能给一块饼干 对每个孩子 i 都有一个胃口值 g i 这是能让孩子们满足胃口的饼干的最小尺寸 并且每块饼干 j 都有一个尺寸 s j 如果 s j gt g i 我们可
  • 等额本息算法及原理

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 首先我们假设我们的借款总额为a 借款年利率为n 借款月利率为b 借款期数为d 总还款为z 每月应还款为y 则会有 z d y 首先我们来算第一个月还钱情况 我们第一个月还的
  • LVS负载均衡群集(NAT模式、IP隧道模式、DR模式)

    目录 一 集群 1 1 含义即特点 1 2 群集的类型 1 3 LVS 的三种工作模式 1 4 LVS 调度算法 1 5 负载均衡群集的结构 1 6 ipvsadm 工具 二 NAT模式 LVS NAT模式配置步骤 实例 配置NFS服务器1
  • 论文笔记:Learning Traffic as Images: A Deep Convolutional Neural Network for Large-Scale Transportation

    2017 Sensor CNN 交通预测 1 交通矩阵提取 x轴 y轴分别是矩阵的时间和空间 交通矩阵的channel数量为1 2 使用CNN进行预测 3 实验部分 3 1 交通矩阵可视化 3 2 不同的CNN框架以及对应的精度
  • JDK动态代理的底层实现原理

    JDK动态代理的底层实现原理 动态代理是许多框架底层实现的基础 比如Spirng的AOP等 其实弄清楚了动态代理的实现原理 它就没那么神奇了 下面就来通过案例和分析JDK底层源码来揭秘她的神秘面纱 让她一丝不挂地呈现在我们面前 邪恶了 代理
  • 软件测试行业核心竞争力是什么?

    1 测试行业正在发生变化 在互联网新趋势和新要求的变革推动下 测试行业也在不知不觉中发生着非常大的改变 从早些年的懵懂发展 大家摸着石头过河 到大多高校设立软件测试专业 再到近几年各种测试培训盛行 如果说早期软件测试行业还是一个风口 随着不
  • 7.27美联储未能给出明确指引,黄金多空该如何布局

    近期有哪些消息面影响黄金走势 黄金多空该如何研判 黄金消息面解析 周四 7月27日 亚市早盘 美元指数承压于101 00关口附近 现货黄金价格维持在1980美元 盎司左右 美联储7月决策符合预期 鲍威尔对利率前景的看法接近 中间立场 介于鹰
  • javascript 判断奇偶性

  • 反思"列名无效"的问题

    发帖解决了 贴在地址 http topic csdn net u 20110316 21 1ee00820 09f4 446a a451 6e84694abfc5 html 829232601 初学 net 今天连数据库 一直报 列名无效
  • 浅谈迁移学习

    迁移学习背景 吴恩达 Andrew Ng 曾说 迁移学习将会是继监督学习之后的下一个机器学习商业成功的驱动力 现如今数据大爆炸 对机器学习模型来说要求快速构建 强泛化 对于数据来说 大部分数据没有标签 而传统的机器学习需要对每个领域都标定大
  • 关于Data at the root level is invalid错误的解决方式

    有时在使用XmlDocument LoadXML 方法时会出现报Data at the root level is invalid的错误 网上很多说发是因为xml文件的格式不对引起 如果你在仔细的查看了xml文件格式后并没有发现问题 那么很